2017-02-01 5 views
0

Итак, у меня есть 2 формы. У основного есть TextBox, и если я нажму F1, он откроет новую форму с DataGridView в зависимости от вставленных значений на TextBox. После двойного щелчка в этой строке из второй формы он снова войдет в основную форму и заполнит TextBox выбранной строкой.Проверка события с TextBox в C#

Тогда в основной форме у меня есть событие Validating на TextBox, и он сможет в зависимости от этого значения показать его в Основной форме DataGridView.

К сожалению, это не сработало, и я думаю, что проблема исходит от CauseValidation от других компонентов. Я отключил его, используя, например: dataGridView1.CauseValidation = false;, но все тот же.

Это код на TextBox события:

private void txtCargs_Validating(object sender, CancelEventArgs e) 
    { 
     e.Cancel = false; 
     try 
     { 
      SqlConnection con = new SqlConnection(cs.DBConnP); 
      con.Open(); 

      string querySelect = @"SELECT RTRIM(CL.Cargs) AS 'Cargs', RTRIM(S.Abvs) AS 'Abss', RTRIM(CL.Linha) AS 'Linha', RTRIM(CL.Qtd) AS 'Quantity' 
            FROM CargaCab CC (NOLOCK) 
            INNER JOIN CargsLin CL (NOLOCK) ON CC.Cargs = CL.Cargs 
            INNER JOIN Stock S (NOLOCK) ON CL.Code = S.Code 
            INNER JOIN Marks M (NOLOCK) ON S.Marks = M.Marks 
            WHERE CC.Date >= GETDATE() - 120 AND CL.State NOT IN ('F', 'A') AND S.TypeEmb = 'P' 
            AND CC.TypeD = 'OCS' AND CL.Cargs = '" + txtCargs.Text.Trim() + "' ORDER BY CL.Carga, S.Marks DESC, S.Abvs"; 
      cmd = new SqlCommand(querySelect); 
      cmd.Connection = con; 

      SqlDataAdapter da = new SqlDataAdapter(cmd); 

      DataSet ds = new DataSet(); 
      da.Fill(ds, "CargaCab"); 

      dataGridView1.DataSource = ds.Tables["CargaCabee"].DefaultView; 

      dataGridView1.Columns[0].ReadOnly = true; 
      dataGridView1.Columns[1].ReadOnly = true; 
      dataGridView1.Columns[2].ReadOnly = true; 
      dataGridView1.Columns[3].ReadOnly = false; 

      con.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error\nDetalhes: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

Что я должен делать?

+0

В какой момент не в состоянии этот код? –

+0

Код не работает в точке останова – RekcsGaming

+1

Почему вы пытаетесь сделать это на мероприятии «Проверка»? Поскольку я знаю, что проверка будет срабатывать, когда вы пытаетесь не сосредоточиться на определенном контроле. Не можете ли вы использовать событие «TextChanged»? –

ответ

1

Краткосрочное

Вместо того, чтобы вся логика в txtCargs_Validating случае, сделать метод, что 2-й вызовов формы, когда его закрытым. Вы можете сделать это, передавая экземпляр 1-го класса на 2-ом, например,

public class SecondForm : Form { 

    private Form _1stForm; 
    public SecondForm(Form 1stForm) 
    { 
    _1stForm = 1stForm; 
    } 

...

public SecondForm_Closing(object sender, EventArgs e) 
{ 
_1stForm.SetTheTextBox(theRowValueSelected); 
} 

Вызов кода из основной формы:

var frm = new SecondForm(this); 
frm.Show(); 

Long Термин

Лучшее решение состоит в том, чтобы иметь весь свой код на уровне бизнес-логики (например, контроллер в MVC или ModelView в MVVM) и BIND все элементы пользовательского интерфейса для структур данных на уровне бизнес-логики.

В любом случае сохранить проверяющее событие для проверки, например:

MessageBox.Show("Error\nDetalhes: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
0

Я предлагаю, сделать это событие, чтобы настраиваемая функция, а не с возвратным BOOL типа. используйте событие text_changed в текстовом поле, а затем вызовите функцию проверки. Я попробовал экземпляр Textbox_Validating event и его вызвал при закрытии формы.

+0

Не могли бы вы уточнить код? – RekcsGaming

0
private void txtCargs_TextChanged(object sender, EventArgs e) 
     { 
      if (ValidateText()) 
      { 
       //Then do this 
      } 
     } 

     private bool ValidateText() 
     { 
      bool Isvalidated = false; 

      try 
      { 
       SqlConnection con = new SqlConnection(cs.DBConnP); 
       con.Open(); 

       string querySelect = @"SELECT RTRIM(CL.Cargs) AS 'Cargs', RTRIM(S.Abvs) AS 'Abss', RTRIM(CL.Linha) AS 'Linha', RTRIM(CL.Qtd) AS 'Quantity' 
            FROM CargaCab CC (NOLOCK) 
            INNER JOIN CargsLin CL (NOLOCK) ON CC.Cargs = CL.Cargs 
            INNER JOIN Stock S (NOLOCK) ON CL.Code = S.Code 
            INNER JOIN Marks M (NOLOCK) ON S.Marks = M.Marks 
            WHERE CC.Date >= GETDATE() - 120 AND CL.State NOT IN ('F', 'A') AND S.TypeEmb = 'P' 
            AND CC.TypeD = 'OCS' AND CL.Cargs = '" + txtCargs.Text.Trim() + "' ORDER BY CL.Carga, S.Marks DESC, S.Abvs"; 
       cmd = new SqlCommand(querySelect); 
       cmd.Connection = con; 

       SqlDataAdapter da = new SqlDataAdapter(cmd); 

       DataSet ds = new DataSet(); 
       da.Fill(ds, "CargaCab"); 

       dataGridView1.DataSource = ds.Tables["CargaCabee"].DefaultView; 

       dataGridView1.Columns[0].ReadOnly = true; 
       dataGridView1.Columns[1].ReadOnly = true; 
       dataGridView1.Columns[2].ReadOnly = true; 
       dataGridView1.Columns[3].ReadOnly = false; 

       con.Close(); 
       Isvalidated = true; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error\nDetalhes: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       Isvalidated = false; 
      } 

      return Isvalidated; 
     } 
+0

То, что я хочу поставить в де «// Тогда это сделать», что вы попали на ValidateText – RekcsGaming

+0

:) нормально, тогда замените этот если (ValidateText()) { // Тогда это сделать } с просто этот ValidateText(); –

+0

Это тоже не работает. Я использую его в Validating Event, и ничего не отображается в DataGridView. – RekcsGaming

0

Я думаю, проблема в том, что вы хотите исправить свое решение, а не решить свою проблему.

Вот краткий набросок того, как я думаю, что это может быть достигнуто:

public class Form1 : Form 
{ 
    public TextBox textBox1 { get; set; } 

    public Button button1 { get; set; } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     var form = new Form2(); 
     form.Show(); 
     textBox1.Text = form.val; 
     //do your sql stuff here 
    } 
} 

public class Form2 : Form 
{ 
    public DataGridView datagriview1 { get; set; } 

    public string val { get; set; } 

    private void datagriview1_CellDoubleClick(object sender, DataGridViewCellEventArgs e) 
    { 
     if (e.RowIndex > -1) 
      val = datagriview1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); 
     Close(); 
    } 
}