在c#中从数据库中删除在datagrid中选择的行

时间:2014-03-12 11:57:10

标签: c#

如何从数据表中删除在网格中选择的特定行。 我试过这段代码。

 string s1 = null;


      int i = datagridInfoOrg.CurrentCell.RowIndex;

            datagridInfoOrg.Rows.RemoveAt(i);
            datagridInfoOrg.Refresh();


        string s = "Select * from Add_Information";
        SqlCommand cmd1 = new SqlCommand(s, con);
        SqlDataReader dr = cmd1.ExecuteReader();
        if (dr.Read())
        {
            s1 = dr[i].ToString();


        }
        cmd1.Dispose();
        dr.Dispose();
        string Query = "delete from Add_Information WHERE CompanyName='"+s1+"'";

        SqlCommand cmd = new SqlCommand(Query, con);


        //conDatabase.Open();
        if (cmd.ExecuteNonQuery() >= 1)
        {

            MessageBox.Show("Succesfully Updated !!");

        }
        else
        {
            MessageBox.Show("No row selected");
        }

通过此代码只删除第一行,但不删除所选行。 任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

您的第s1 = dr[i].ToString();行始终会为您提供第一行的第i列,因为您只执行了第一行dr.Read()

答案 1 :(得分:0)

好像你的逻辑错了。

SqlDataReader.Read()方法逐行读取您的读者。这意味着当您在 if语句(而不是像 while语句)中编写dr[i].ToString()时,此代码只运行一次并读取 i-th 第一行的数字 。这就是为什么删除第一行太正常了。

但是,由于我们不知道代码中i的价值是什么,因此无法假设更多。

答案 2 :(得分:0)

我会采用稍微不同的方法从所选行获取单元格数据,如下所示。这里的想法不是通过索引来获取单元格值并在删除查询中使用该值,因此单元格中的值将用于获取DataTable中的行或者直接转到数据库中的表并删除与DataGridView中找到的公司名称匹配的一行或多行。

/// <summary>
/// In the case there is a column in the DataGridView
/// named CompanyNameColumn
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cmdRemoveDataGridViewRow_Click(object sender, EventArgs e)
{
    // make sure we have a row to work with
    if (!datagridInfoOrg.CurrentRow.IsNewRow)
    {
        // use this value for your query
        string KeyValue = datagridInfoOrg
            .CurrentRow
            .Cells["CompanyNameColumn"]
            .Value
            .ToString();

        if (!string.IsNullOrWhiteSpace(KeyValue))
        {
            // row index for current row
            // int rowIndex = datagridInfoOrg.CurrentCell.RowIndex;

            // do your delete and would suggest using a parameterized
            // query especially if there is a chance of embedded apostrophe
            // in the cell value
            datagridInfoOrg.Rows.Remove(datagridInfoOrg.CurrentRow);
        }
        else
        {
            // recovery code in the event the value in the cell
            // was not valid.
        }
    }
}