2016-07-07 3 views
2

I Bind данных к DataGridView, используя следующий кодDataGridView колонок Index Возврат 0 после обновления

private void BindGrid() 
     { 
      try 
      { 
       string constr = "Data Source=INSPIRE-1;" + 
      "Initial Catalog=testdatabase;" + 
      "User id=testuser;" + 
      "Password=tester;"; 
       using (SqlConnection con = new SqlConnection(constr)) 
       { 
        using (SqlCommand cmd = new SqlCommand("SELECT * FROM mytable", con)) 
        { 
         cmd.CommandType = CommandType.Text; 
         using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) 
         { 
          using (DataTable dt = new DataTable()) 
          { 
           sda.Fill(dt); 
           dataGridView1.DataSource = dt; 
          } 
         } 
        } 
       } 
       if (flag == false) 
       { 
        flag = true; 
        DataGridViewButtonColumn uninstallButtonColumn = new DataGridViewButtonColumn(); 
        uninstallButtonColumn.Name = "Edit"; 
        uninstallButtonColumn.Text = "Edit"; 
        dataGridView1.Columns.Insert(4, uninstallButtonColumn); 
       } 
      } 
      catch (Exception error) 
      { 
       MessageBox.Show(error.Message); 
      } 
     } 

I Обновление выбранной записи путем подключения к событию нажатия кнопки в DataGridView строке, как этот

void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
     { 
      if (e.ColumnIndex ==4) 
      { 
       button4.Enabled = false; 

       try 
       { 
        orderId = (string)dataGridView1.SelectedCells[0].OwningRow.Cells[0].Value; 
        using (SqlConnection conn = new SqlConnection(constr)) 
        { 

         try 
         { 
          conn.Open(); 
          SqlDataReader myReader = null; 
          string commandText = "select * from mytable where name= @name"; 
          SqlCommand command = new SqlCommand(commandText, conn); 
          command.Parameters.AddWithValue("@name", orderId); 
          myReader = command.ExecuteReader(); 
          while (myReader.Read()) 
          { 
           textBox1.Text = myReader["name"].ToString(); 
           textBox2.Text = myReader["age"].ToString(); 
           textBox3.Text = myReader["phone"].ToString(); 
           textBox4.Text = myReader["address"].ToString(); 


          } 
         } 
         catch (Exception err) 
         { 
          MessageBox.Show(err.Message); 
         } 

        } 
       } 
       catch (Exception error) 
       { 
       } 

      } 

     } 

Теперь я обновить значения, используя код ниже

private void button5_Click(object sender, EventArgs e) 
    { 
     using (SqlConnection conn = new SqlConnection(constr)) 
     { 
      conn.Open(); 
      using (SqlCommand cmd = 
       new SqlCommand("UPDATE mytable SET [email protected],[email protected],[email protected],[email protected]" + 
        " WHERE [email protected]", conn)) 
      { 
       cmd.Parameters.AddWithValue("@NewName", textBox1.Text); 
       cmd.Parameters.AddWithValue("@NewAge", textBox2.Text); 
       cmd.Parameters.AddWithValue("@NewPhone", textBox3.Text); 
       cmd.Parameters.AddWithValue("@NewAddress", textBox4.Text); 
       cmd.Parameters.AddWithValue("@oldname", orderId); 
       try 
       { 
        int rows = cmd.ExecuteNonQuery(); 
        MessageBox.Show("Updated Successfully"); 
       } 
       catch (SqlException ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 
      } 
     } 
     BindGrid(); 
     textBox1.Clear(); 
     textBox2.Clear(); 
     textBox3.Clear(); 
     textBox4.Clear(); 
     button4.Enabled=true; 


    } 

Но после того, как я нажимаю U pdate, затем щелкните по столбцу Button, соответствующему строке e.ColumnIndex, всегда возвращает 0.

Что я делаю неправильно?

UPDATE:

Пожалуйста, смотрите скриншот

enter image description here

+0

Каково место/положение 'Button' в вашем' DataGridView'? –

+0

@RahulHendawe Его в первом фрагменте кода 'dataGridView1.Columns.Insert (4, uninstallButtonColumn);' .Пожалуйста, проверьте. – techno

+0

Извините, не заметил этого, проверьте ниже ответ! –

ответ

3

Ответ Rahul будет работать, но выглядит как orderId = (string)dataGridView1.SelectedCells[0].OwningRow.Cells[0].Value; должен быть модифицированным, чтобы получить Cells[1].Value, а не 0 как 0 - ячейка кнопки со второго раза. Но в первый раз вам нужно использовать 0, так как кнопка указана в индексе 4. Попробуйте изменить ниже.

Насколько я понимаю, проблема возникает после обновления, вы снова вызываете BindGrid, и поскольку флаг является истинным, он просто устанавливает источник данных снова для сетки и не генерирует кнопку снова, таким образом, кнопка перемещается в индекс 0, за которой следует datatable колонны.

Другой способ решить это изменить код немного как dataGridView1.Columns.Insert(0, uninstallButtonColumn); dataGridView1.Columns[0].DisplayIndex = 4;

А потом в CellClick проверки событий для e.ColumnIndex == 0. Это поможет вам отображать кнопку в нужном месте и всегда работать с кликом, так как columnindex никогда не изменяется.

+0

Спасибо за ваш ответ. Но кнопка остается в 4-м столбце после нажатия кнопки «Обновить». – techno

+0

Да. Но что именно требуется? Его нужно переместить? Не удовлетворяет ли условие обновления Click? –

+0

Кнопка должна оставаться там, и когда я нажимаю на нее, текстовые поля должны обновляться со значениями в строке. Он работает по назначению, прежде чем нажимать кнопку обновления, но после нажатия кнопки обновления. Клавиша в ячейке кнопки строки не создает значения в текстовом поле. – techno

0

вы можете проверить button index, как показано ниже, не сравнивая его index:

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
{ 
    var senderGrid = (DataGridView)sender; 

    if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn && 
     e.RowIndex >= 0) 
    { 
     //TODO - Button Clicked - Execute Code Here 
    } 
} 
+0

Спасибо, но все тот же вопрос. Код работает до нажатия кнопки обновления, но после того, как я нажму кнопку обновления, ничего не работает. – techno

+0

положил точку останова на 'BindGrid()' и проверил, будут ли строки внутри 'if (flag == false) 'выполняется или нет, я подозреваю в следующий раз, когда вы нажимаете' update_button', когда вы устанавливаете строки 'flag == true' внутри' if (flag == false) 'не выполняются. –

+0

После нажатия кнопки обновления код для добавления кнопки не выполняется. Я добавил флаг, чтобы предотвратить дублирование ввода кнопки в datagrid. – techno

Смежные вопросы