Woody
Woody

Reputation: 1189

How to delete a selected DataGridViewRow and update a connected database table?

I have a DataGridView control on a Windows Forms application (written with C#).

What I need is: when a user selects a DataGridViewRow, and then clicks on a 'Delete' button, the row should be deleted and next, the database needs to be updated using table adapters.

This is what I have so far:

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

Furthermore, this only deletes one row. I would like it where the user can select multiple rows.

Upvotes: 57

Views: 434485

Answers (21)

CW1255
CW1255

Reputation: 121

//This worked for me. The datasource is a BindingList

private void DataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
   if (e.Button == MouseButtons.Left
      && e.ColumnIndex < 0
      && e.RowIndex >= 0
      && e.RowIndex < DataGridView1.NewRowIndex)
   {
      intRowHeader = e.RowIndex;
   }
}

private void DataGridView1_KeyDown(object sender, KeyEventArgs e)
{
   if (intRowHeader.HasValue && e.KeyCode == Keys.Delete)
   {
      DataGridView1.Rows.RemoveAt((int)intRowHeader);
      intRowHeader = null;
   }

}

Upvotes: 0

Saeid Shariati
Saeid Shariati

Reputation: 11

this command delete selected row when user selected in datagridview:

gvTest.Rows.RemoveAt(dvTest.CurrentRow.Index];

Upvotes: 1

This worked for me :

private void btnRemove_Click(object sender, EventArgs e) {
    int count = dgvSchedule.SelectedRows.Count;

    while (count != 0) {
        dgvSchedule.Rows.RemoveAt(dgvSchedule.SelectedRows[0].Index);
        count--;
    }
 }

Upvotes: 0

Видео Video
Видео Video

Reputation: 1

It Work for me !

private: System::Void MyButton_Delete_Click(System::Object^ sender, System::EventArgs^ e) {
    // Удалить столбец(Row).
    MydataGridView->Rows->RemoveAt(MydataGridView->CurrentCell->RowIndex);
}

Upvotes: -2

user10970297
user10970297

Reputation:

Try this:

foreach (DataGridViewRow item in this.YourGridViewName.SelectedRows)
{
    string ConnectionString = (@"Data Source=DESKTOPQJ1JHRG\SQLEXPRESS;Initial Catalog=smart_movers;Integrated Security=True");

    SqlConnection conn = new SqlConnection(ConnectionString);
    conn.Open();
    SqlCommand cmd = new SqlCommand("DELETE FROM TableName WHERE ColumnName =@Index", conn);
    cmd.Parameters.AddWithValue("@Index", item.Index);
    int i = cmd.ExecuteNonQuery();

    if (i != 0)
    {
        YourGridViewName.Rows.RemoveAt(item.Index);
        MessageBox.Show("Deleted Succefull!", "Great", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    else {
        MessageBox.Show("Deleted Failed!", "Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Upvotes: 0

Rakesh
Rakesh

Reputation: 1

   ArrayList bkgrefs = new ArrayList();
                    foreach (GridViewRow rowd in grdOptionExtraDetails.Rows)
                    {
                        CheckBox cbf = (CheckBox)rowd.Cells[1].FindControl("chkbulk");

                            if (cbf.Checked)
                            {
                                rowd.Visible = true;
                                 bkgrefs.Add(Convert.ToString(grdOptionExtraDetails.Data.Rows[rowd.RowIndex]["OptionID"]));

                            }
                            else
                            {
                                grdOptionExtraDetails.Data.Rows.RemoveAt(rowd.DataItemIndex);
                                rowd.Visible = false;
                            }


                    }

Upvotes: 0

user2448320
user2448320

Reputation: 31

maybe you can use temp list for delete. for ignore row index change

<pre>
private void btnDelete_Click(object sender, EventArgs e)
{
    List<int> wantdel = new List<int>();
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if ((bool)row.Cells["Select"].Value == true)
        wantdel.Add(row.Index);
    }

    wantdel.OrderByDescending(y => y).ToList().ForEach(x =>
    {
        dataGridView1.Rows.RemoveAt(x);
    });           
}
</pre>

Upvotes: 3

Grofman
Grofman

Reputation: 29

private void btnDelete_Click(object sender, EventArgs e)
{
    dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
                ?BindingSource.EndEdit();
                ?TableAdapter.Update(this.?DataSet.yourTableName);
}

//NOTE:
//? - is your data from database

Exception no need ... or change with your own code.

CODE: enter image description here

DB: enter image description here

Example: prntscr.com/p3208c

DB Set: http://prntscr.com/p321pw

Upvotes: 0

Z.D.E Informaticien
Z.D.E Informaticien

Reputation: 31

You delete first from the database and then you update your datagridview:

//let's suppose delete(id) is a method which will delete a row from the database and
// returns true when it is done
int id = 0;
//we suppose that the first column in the datagridview is the ID of the ROW :
foreach (DataGridViewRow row in this.dataGridView1.SelectedRows)
   id = Convert.ToInt32(row.Cells[0].Value.ToString());
if(delete(id))                               
   this.dataGridView1.Rows.RemoveAt(this.dataGridView1.SelectedRows[0].Index);
//else show message error!

Upvotes: 0

Pavan Muppalla
Pavan Muppalla

Reputation: 1

for (int j = dataGridView1.Rows.Count; j > 0 ; j--)
{
    if (dataGridView1.Rows[j-1].Selected)
        dataGridView1.Rows.RemoveAt(j-1);
}

Upvotes: -2

Sarah Chaygani
Sarah Chaygani

Reputation: 49

Well, this is how I usually delete checked rows by the user from a DataGridView, if you are associating it with a DataTable from a Dataset (ex: DataGridView1.DataSource = Dataset1.Tables["x"]), then once you will make any updates (delete, insert,update) in the Dataset, it will automatically happen in your 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);
            }
        }

Upvotes: 1

Mohammad Saqib
Mohammad Saqib

Reputation: 1

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();
    }
}

Upvotes: 0

user4477835
user4477835

Reputation:

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());
    }
}

Upvotes: 1

Sherif Hamdy
Sherif Hamdy

Reputation: 593

Try this:

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

Upvotes: 0

Filip
Filip

Reputation: 231

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

Removes rows which indexes are in selected cells. So, select any cells, and their corresponding rows will be removed.

Upvotes: 23

serge_gubenko
serge_gubenko

Reputation: 20492

I have written the following code, please take a look:

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

using the Index of the selected row still could work; see if the code below will do the trick:

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

I hope this helps, regards.

Upvotes: 10

Sarvar Nishonboyev
Sarvar Nishonboyev

Reputation: 13110

have a look this way:

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);
 }

Upvotes: 0

littlecodefarmer758
littlecodefarmer758

Reputation: 976

To delete multiple rows in datagrid, c#

parts of my code:

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();

        }

Upvotes: 1

huncyrus
huncyrus

Reputation: 658

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

This solution can be delete a row (not selected, clicked row!) via "e" param.

Upvotes: 5

Navid Farhadi
Navid Farhadi

Reputation: 3467

This code removes selected items of dataGridView1:

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

Upvotes: 93

TheVillageIdiot
TheVillageIdiot

Reputation: 40527

here is one very simple example:

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"/>

Code Behind:

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;
    }
}

you will have to use checkboxes or some other mechanism to allow users to select multiple rows and then you can browse the rows for ones with the checkbox checked and then remove those rows.

Upvotes: -3

Related Questions