حذف سطرهای تیک خورده از DataGridView

در این پست می خواهم که نحوه ی حذف چندین سطر موجود در Datagridview که با استفاده از Checkbox تیک خورده اند را به شما آموزش دهم . کاربر با استفاده از Checkbox چندین سطر را علامت می زند و سپس بر روی دکمه ی Delete کلیک می کند . بعد از تایید حذف ، سطر ها از بانک اطلاعاتی حذف می شوند . فرض کنید که در بانک اطاعاتی یک جدول با مشخصات زیر وجود دارد :
Delete-Cheked-Row-DataGrid (1)

همچنین برای نمونه 2 سطر را به این جدول اضافه می کنیم :

Delete-Cheked-Row-DataGrid (2)

یک کنترل Datagridview و یک Button را بر روی فرم قرار دهید :
Delete-Cheked-Row-DataGrid (3)

فضای نام های زیر را به کلاس فرم اضافه کنید :

private void DataBind()
{
    dataGridView1.DataSource = null;
    using (SqlConnection SqlConnection1 = new SqlConnection(connectionString))
    {
        using (SqlCommand SqlCommand1 = new SqlCommand("SELECT CustomerId as [شماره], CustomerName as [نام], CustomerFamily as [نام خانوادگی] FROM Customers", SqlConnection1))
        {
            SqlCommand1.CommandType = CommandType.Text;
            using (SqlDataAdapter SqlDataAdapter1 = new SqlDataAdapter(SqlCommand1))
            {
                using (DataTable DataTable1 = new DataTable())
                {
                    SqlDataAdapter1.Fill(DataTable1);
                    dataGridView1.DataSource = DataTable1;
                }
            }
        }
    }
}

private const string connectionString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\siavash\Documents\Visual Studio 2012\Projects\PhoneBookNotThreeLayer\frmMain\bin\Debug\DataBase.mdf;Integrated Security=True;Connect Timeout=30";

public Form1()
{
    InitializeComponent();

    //تعیین تعداد ستون های دیتاگرید ویو
    this.dataGridView1.ColumnCount = 3;

    this.dataGridView1.AllowUserToAddRows = false;


    //اضافه کردن ستون ها به دیتاگرید ویو
    dataGridView1.Columns[0].Name = "CustomerId";
    dataGridView1.Columns[0].HeaderText = "شماره";
    dataGridView1.Columns[0].DataPropertyName = "شماره";
    dataGridView1.Columns[0].Width = 100;

    dataGridView1.Columns[1].HeaderText = "نام";
    dataGridView1.Columns[1].Name = "Name";
    dataGridView1.Columns[1].DataPropertyName = "نام";
    dataGridView1.Columns[1].Width = 100;

    dataGridView1.Columns[2].Name = "Family";
    dataGridView1.Columns[2].HeaderText = "نام خانوادگی";
    dataGridView1.Columns[2].DataPropertyName = "نام خانوادگی";
    dataGridView1.Columns[2].Width = 100;
    DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
    checkBoxColumn.HeaderText = "";
    checkBoxColumn.Width = 30;
    checkBoxColumn.Name = "checkBoxColumn";
    this.dataGridView1.Columns.Insert(0, checkBoxColumn);

    //اضافه کردن داده های موجود در پایگاه داده به دیتاگرید ویو
    this.DataBind();
}

متد DataBind با استفاده از کلاس های SqlConnection و SqlDataAdapter داده های موجود در جدول Customers پایگاه داده را واکشی می کند و در Datagridview نمایش می دهد . چون برای اضافه کردن ستون ها از خاصیت DataPropertyName استفاده کردیم ، SqlDataAdapter داده ها رو در ستون هایی که قبلا اضافه کردیم قرار می دهد .
و در اخر باید کد های لازم برای حذف سطر ها را در رویداد کلیک دکمه ی Button قرار دهیم . کاربر ابتدا سطر های که قصد دارد حذف کند را علامت میزند و سپس بر روی این دکمه کلیک می کند ، بعد از تایید حذف ، سطر ها از Datagridview و پایگاه داده حذف می شوند. بر روی دکمه دوبار کلیک کرده و کد زیر را در رویداد کلیک ان بنویسید :

private void button1_Click(object sender, EventArgs e)
{
    List<DataGridViewRow> selectedRows = (from row in dataGridView1.Rows.Cast<DataGridViewRow>()
                                            where Convert.ToBoolean(row.Cells["checkBoxColumn"].Value) == true
                                            select row).ToList();
    if (MessageBox.Show( "تایید حذف","آیا مایل به حذف سطر ها می باشید ؟", MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        foreach (DataGridViewRow row in selectedRows)
        {
            using (SqlConnection SqlConnection1= new SqlConnection(connectionString))
            {
                using (SqlCommand SqlCommand1= new SqlCommand("DELETE FROM Customers WHERE CustomerId = @CustomerId", SqlConnection1))
                {
                    SqlCommand1.CommandType = CommandType.Text;
                    SqlCommand1.Parameters.AddWithValue("@CustomerId", row.Cells["CustomerId"].Value);
                    SqlConnection1.Open();
                    SqlCommand1.ExecuteNonQuery();
                    SqlConnection1.Close();
                }
            }
        }

        this.DataBind();
    }
}

ابتدا با استفاده از یک کوئری Linq سطرهایی که علامت خورده باشند را مشخص می کنیم سپس با استفاده از یک حلقه foreach تک تک آنها را حذف می کنیم .