• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2132
  • Last Modified:

Datagridview delete button click event

I have a datagridview on my form populated from a dataset which is pulled from an sql database. Each row in the datagridview has a delete button. I need to capture the button click event and which row in the datagridview it was clicked so it can be deleted from the database.
//View all movies in the database
        private void btnViewAllMovies_Click(object sender, EventArgs e)
        {
            DAL data = new DAL();
            DataSet ds = data.getAllData("select * from tblMovies");
            dgvAllMovies.DataSource = ds.Tables[0];
            CreateDelete();

          public void CreateDelete()
        {
            //Creates the delete column and adds the delete buttons for each row
            var buttonCol = new DataGridViewButtonColumn();
            buttonCol.Name = "Delete";
            buttonCol.HeaderText = "Delete";
            buttonCol.Text = "Delete";
            buttonCol.UseColumnTextForButtonValue = true;
            buttonCol.DisplayIndex = 0;

       //Button click event test - Not working
        private void dgvAllMovies_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            MessageBox.Show("Click");

        }

Open in new window

0
98fatboyrider
Asked:
98fatboyrider
  • 3
2 Solutions
 
kris_perCommented:

Sample code below:
private void btnViewAllMovies_Click(object sender, EventArgs e)
        {
            DAL data = new DAL();
            DataSet ds = data.getAllData("select * from tblMovies");
            dgvAllMovies.DataSource = ds.Tables[0];

            // Add Button Column
            DataGridViewButtonColumn buttonCol = new DataGridViewButtonColumn();
            buttonCol.Name = "Delete";
            buttonCol.HeaderText = "Delete";
            buttonCol.Text = "Delete";
            buttonCol.UseColumnTextForButtonValue = true;
            buttonCol.DisplayIndex = 0;
            dgvAllMovies.Columns.Add(buttonCol);

            // add event handler for cell content click
            dgvAllMovies.CellContentClick += new DataGridViewCellEventHandler(dgvAllMovies_CellContentClick);            
        }

        void dgvAllMovies_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0) // only if Delete button column/here it is first column
            {
                // remove the row in the datasource which 
                // will automatically remove row from the grid                

                DataGridViewRow grigRow = dgvAllMovies.Rows[e.RowIndex];
                DataRowView drv = grigRow.DataBoundItem as DataRowView;
                DataTable dt = (DataTable)dgvAllMovies.DataSource;
                dt.Rows.Remove(drv);
            }
        }

Open in new window

0
 
kris_perCommented:

In addtion to the above code which will remove the row from Grid and datasource, you need to add code to actually save the changes to database.
Have a Save button and on clicking that button have the below code:
private void buttonSave_Click(object sender, EventArgs e)
        {
            DataTable dt = (DataTable)dgvAllMovies.DataSource;

            DAL data = new DAL();
            data.SaveData(dt, "select * from tblMovies");
        }

// ADD NEW SaveData METHOD to DAL class
public class DAL
        {
            // your DAL class might have other code here...

            // new method
            public void SaveData(DataTable dataTable, string sourceQuery)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();

                    SqlDataAdapter adapter = new SqlDataAdapter();

                    adapter.SelectCommand = new SqlCommand(sourceQuery, conn);

                    SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);

                    adapter.Update(dataTable);
                }
            }
        }

Open in new window

0
 
98fatboyriderAuthor Commented:
This is close, but the line below is giving a couple of errors. Suggestions?
dt.Rows.Remove(drv);
//The best overloaded method match for 'System.Data.DataRowCollection.Remove(System.Data.DataRow)' has some invalid arguments
//Argument '1': cannot convert from 'System.Data.DataRowView' to 'System.Data.DataRow'

Open in new window

0
 
kris_perCommented:
Sorry, correct the line to:

dt.Rows.Remove(drv.Row);
0

Featured Post

The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now