2010-01-18 5 views
38

У меня есть управление DataGridView в приложении Windows Forms (написанное на C#).Как удалить выбранный DataGridViewRow и обновить связанную таблицу базы данных?

Что мне нужно: когда пользователь выбирает DataGridViewRow, а затем нажимает на кнопку «Удалить», то строка должна быть удалена и рядом, база данных должна быть обновлена ​​с помощью таблицы адаптеров.

Это то, что я до сих пор:

private void btnDelete_Click(object sender, EventArgs e) 
{ 
    if (this.dataGridView1.SelectedRows.Count > 0) 
    { 
     dataGridView1.Rows.RemoveAt(this.dataGridView1.SelectedRows[0].Index); 
    }     
} 

Кроме того, это удаляет только одну строку. Мне бы хотелось, чтобы пользователь мог выбрать несколько строк.

ответ

55

Этот код удаляет выбранные элементы из dataGridView1:

private void btnDelete_Click(object sender, EventArgs e) 
{ 
    foreach (DataGridViewRow item in this.dataGridView1.SelectedRows) 
    { 
     dataGridView1.Rows.RemoveAt(item.Index); 
    } 
} 
+6

В общем, это не всегда безопасно быть модифицировать объект, относящийся к объекту мы итерация, а также индексы, возможно, не будет обновляться. – jmnben

+7

Лучшие практики говорят использовать цикл for вместо цикла foreach и итерации назад от конца. Это поможет вам сохранить свой индекс и избежать проблем при редактировании во время ваших итераций. – Grungondola

+1

@Grungondola вы должны сделать отдельный ответ для этого – User

-3

здесь один очень простой пример:

ASPX:

<asp:GridView ID="gvTest" runat="server" SelectedRowStyle-BackColor="#996633" 
     SelectedRowStyle-ForeColor="Fuchsia"> 
    <Columns> 
     <asp:CommandField ShowSelectButton="True" /> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <%# Container.DataItemIndex + 1 %> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 
<asp:Button ID="btnUpdate" runat="server" Text="Update" OnClick="btnUpdateClick"/> 

Код За:

public partial class _Default : System.Web.UI.Page 
{ 
    private readonly DataTable _dataTable; 

    public _Default() 
    { 
     _dataTable = new DataTable(); 

     _dataTable.Columns.Add("Serial", typeof (int)); 
     _dataTable.Columns.Add("Data", typeof (string)); 

     for (var i = 0; ++i <= 15;) 
     _dataTable.Rows.Add(new object[] {i, "This is row " + i}); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
      BindData(); 
    } 

    private void BindData() 
    { 
     gvTest.DataSource = _dataTable; 
     gvTest.DataBind(); 
    } 

    protected void btnUpdateClick(object sender, EventArgs e) 
    { 
     if (gvTest.SelectedIndex < 0) return; 

     var r = gvTest.SelectedRow; 

     var i = r.DataItemIndex; 

     //you can get primary key or anyother column vlaue by 
     //accessing r.Cells collection, but for this simple case 
     //we will use index of selected row in database. 
     _dataTable.Rows.RemoveAt(i); 

     //rebind with data 
     BindData(); 

     //clear selection from grid 
     gvTest.SelectedIndex = -1; 
    } 
} 

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

+0

Я использую WinForms ... – Woody

10

Я написал следующий код, пожалуйста, обратите внимание:

foreach (DataGridViewRow row in dataGridView1.SelectedRows) 
    if (!row.IsNewRow) dataGridView1.Rows.Remove(row); 

с использованием Index выбранной строки по-прежнему может работать; см., если код ниже сделает трюк:

int selectedCount = dataGridView1.SelectedRows.Count;   
while (selectedCount > 0) 
{ 
    if (!dataGridView1.SelectedRows[0].IsNewRow) 
     dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index); 
    selectedCount--; 
} 

Надеюсь, это поможет, приветствует.

+0

спасибо ... главная проблема, с которой я сейчас сталкиваюсь, заключается в сохранении базы данных с помощью табличных адаптеров. – Woody

+0

вам нужно предоставить более подробную информацию о том, что не работает для вас; Бьюсь об заклад, лучший ответ, который вы получите, начиная новый вопрос с помощью кода, который вызывает проблемы –

4
private void btnDelete_Click(object sender, EventArgs e) 
{ 
    if (e.ColumIndex == 10)// 10th column the button 
    { 
     dataGridView1.Rows.Remove(dataGridView1.Rows[e.RowIndex]); 
    }     
} 

Это решение может быть удалено из строки (не выбрано, нажата строка!) С помощью параметра «e».

+0

Почему бы не использовать foreach вместо этого? Обращайтесь к ответу @ Навида Фархади. –

18
private void buttonRemove_Click(object sender, EventArgs e) 
{ 
    foreach (DataGridViewCell oneCell in dataGridView1.SelectedCells) 
    { 
     if (oneCell.Selected) 
      dataGridView1.Rows.RemoveAt(oneCell.RowIndex); 
    } 
} 

Удаляет строки, индексы которых находятся в выбранных ячейках. Итак, выберите любые ячейки, и их соответствующие строки будут удалены.

1

Для удаления нескольких строк в DataGrid, C#

части моего кода:

private void btnDelete_Click(object sender, EventArgs e) 
    { 
     foreach (DataGridViewRow row in datagrid1.SelectedRows) 
     { 
      //get key 
      int rowId = Convert.ToInt32(row.Cells[0].Value); 

      //avoid updating the last empty row in datagrid 
      if (rowId > 0) 
      { 
       //delete 
       aController.Delete(rowId); 

       //refresh datagrid 
       datagrid1.Rows.RemoveAt(row.Index); 
      } 
     } 
    } 




public void Delete(int rowId) 
     { 
      var toBeDeleted = db.table1.First(c => c.Id == rowId); 
      db.table1.DeleteObject(toBeDeleted); 
      db.SaveChanges(); 

     } 
0

посмотреть этот путь:

if (MessageBox.Show("Sure you wanna delete?", "Warning", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes) 
{ 
    foreach (DataGridViewRow item in this.dataGridView1.SelectedRows) 
    { 
     bindingSource1.RemoveAt(item.Index); 
    } 
     adapter.Update(ds); 
} 
1

Попробуйте это:

if (dgv.SelectedRows.Count>0) 
{ 
    dgv.Rows.RemoveAt(dgv.CurrentRow.Index); 
} 
1

Ну, так я обычно удаляю проверенные строки пользователем из DataGridView, если вы связываете его с DataTable с Dataset (например: DataGridView1.DataSource = Dataset1.Tables["x"]), после того как вы сделаете все обновления (удалить, вставить, обновить) в Dataset, это автоматически произойдет в вашем DataGridView.

if (MessageBox.Show("Are you sure you want to delete this record(s)", "confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.Yes) 
     { 
      try 
      { 
       for (int i = dgv_Championnat.RowCount -1; i > -1; i--) 
       { 
        if (Convert.ToBoolean(dgv_Championnat.Rows[i].Cells[0].Value) == true) 
        { 
         Program.set.Tables["Champ"].Rows[i].Delete(); 
        } 
       } 
       Program.command = new SqlCommandBuilder(Program.AdapterChampionnat); 
       if (Program.AdapterChampionnat.Update(Program.TableChampionnat) > 0) 
       { 
        MessageBox.Show("Well Deleted"); 
       } 
      } 
      catch (SqlException ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
1
private: System::Void button9_Click(System::Object^ sender, System::EventArgs^ e) 
{ 
    String^ constring = L"datasource=localhost;port=3306;username=root;password=password"; 
    MySqlConnection^ conDataBase = gcnew MySqlConnection(constring); 
    conDataBase->Open(); 
    try 
    { 
     if (MessageBox::Show("Sure you wanna delete?", "Warning", MessageBoxButtons::YesNo) == System::Windows::Forms::DialogResult::Yes) 
     { 
      for each(DataGridViewCell^ oneCell in dataGridView1->SelectedCells) 
      { 
       if (oneCell->Selected) { 
        dataGridView1->Rows->RemoveAt(oneCell->RowIndex); 
        MySqlCommand^ cmdDataBase1 = gcnew MySqlCommand("Delete from Dinslaken_DB.Configuration where Memory='ORG 6400H'"); 
        cmdDataBase1->ExecuteNonQuery(); 
        //sda->Update(dbdataset); 
       } 
      }   
     } 
    } 
    catch (Exception^ex) 
    { 
     MessageBox::Show(ex->ToString()); 
    } 
} 
0
if(this.dgvpurchase.Rows.Count>1) 
{ 
    if(this.dgvpurchase.CurrentRow.Index<this.dgvpurchase.Rows.Count) 
    { 
     this.txtname.Text = this.dgvpurchase.CurrentRow.Cells[1].Value.ToString(); 
     this.txttype.Text = this.dgvpurchase.CurrentRow.Cells[2].Value.ToString(); 
     this.cbxcode.Text = this.dgvpurchase.CurrentRow.Cells[3].Value.ToString(); 
     this.cbxcompany.Text = this.dgvpurchase.CurrentRow.Cells[4].Value.ToString(); 
     this.dtppurchase.Value = Convert.ToDateTime(this.dgvpurchase.CurrentRow.Cells[5].Value); 
     this.txtprice.Text = this.dgvpurchase.CurrentRow.Cells[6].Value.ToString(); 
     this.txtqty.Text = this.dgvpurchase.CurrentRow.Cells[7].Value.ToString(); 
     this.txttotal.Text = this.dgvpurchase.CurrentRow.Cells[8].Value.ToString(); 
     this.dgvpurchase.Rows.RemoveAt(this.dgvpurchase.CurrentRow.Index); 
     refreshid(); 
    } 
} 
+1

Не могли бы вы объяснить ваш ответ, простого голого кода недостаточно –

-1
for (int j = dataGridView1.Rows.Count; j > 0 ; j--) 
{ 
    if (dataGridView1.Rows[j-1].Selected) 
     dataGridView1.Rows.RemoveAt(j-1); 
} 
Смежные вопросы