通过从按钮单击的gridview中选择,从sql表中删除记录

时间:2013-05-18 19:33:04

标签: c#

我想通过按另一个表单中的按钮从一个表格中的数据网格视图中删除记录。但我收到nullreferenceexception was unhandled错误。我是c#的新手,所以如果有人能给我写正确的代码,我会非常感激。

这是我到目前为止所得到的。

private void button1_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection(@" Data Source=HOME-D2CADC8D4F\SQL;Initial Catalog=motociclete;Integrated Security=True");

    SqlCommand cmd = new SqlCommand();
    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
        DataGridViewRow dr = dataGridView1.Rows[i];
        if (dr.Selected == true)
        {
            dataGridView1.Rows.RemoveAt(i);
            try
            {
                con.Open();
                cmd.CommandText = "Delete from motociclete where codm=" + i + "";
                cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
    this.Close();
}

5 个答案:

答案 0 :(得分:1)

只需颠倒循环的经文。

 for (int i = dataGridView1.Rows.Count - 1; i >= 0 ; i--)

通过这种方式,您的循环不受行数变化的影响

另外。这是我不会在每次执行命令时打开/关闭连接的情况,如果以这种方式使用参数,命令执行可能会更高效

using(SqlConnection con = new SqlConnection(@" Data Source=HOME-D2CADC8D4F\SQL;Initial Catalog=motociclete;Integrated Security=True"))
using(SqlCommand cmd = new SqlCommand("Delete from motociclete where codm=@id", con))
{
    con.Open();
    cmd.Parameters.AddWithValue("@id", 0);
    for (int i = dataGridView1.Rows.Count-1; i >= 0; i++)
    {
        DataGridViewRow dr = dataGridView1.Rows[i];
        if (dr.Selected == true)
        {
            dataGridView1.Rows.RemoveAt(i);
            cmd.Parameters["@id"].Value = i;
            cmd.ExecuteNonQuery();
        }
    }
}

答案 1 :(得分:0)

您在迭代行时会删除行,这会导致NullPointerException,因为当您删除行时,计数会发生变化,但循环仍然与初始计数一样长。

这样做的一种方法是创建临时行列表并在以下后删除它们:

List<DataGridViewRow> rowstodelete = new List<DataGridViewRow>();

for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
    DataGridViewRow dr = dataGridView1.Rows[i];
    if (dr.Selected)
    {
        rowstodelete.Add(dr);
        try
        {
              con.Open();
              cmd.CommandText = "Delete from motociclete where codm=" + i + "";
              cmd.ExecuteNonQuery();
              con.Close();
         }
         catch (Exception ex)
         {
               MessageBox.Show(ex.ToString());
         }
    }
}

foreach (DataGridViewRow row in rowstodelete)
{
    dataGridView1.Rows.Remove(row);
}

答案 2 :(得分:0)

private void button1_Click(object sender, EventArgs e)
{  int row =-1;   

      SqlConnection con = new SqlConnection(@" Data Source=HOME-D2CADC8D4F\SQL;Initial Catalog=motociclete;Integrated Security=True");

    SqlCommand cmd = new SqlCommand();
    row = new_tab_Object.CurrentCell.RowIndex;

            if (row!= (-1))
            {

                new_tab_Object.Rows.RemoveAt(row);                
                row = -1;
            try
            {
                con.Open();
                cmd.CommandText = "Delete from motociclete where codm=" + row + "";
                cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

    this.Close();
  }

你的......

答案 3 :(得分:0)

为什么要遍历所有行,请使用dataGridView1.SelectedRows:

for (int i = dataGridView1.SelectedRows.Count - 1; i >= 0; i--)
    dataGridView1.Rows.Remove(dataGridView1.SelectedRows[i]);

还使用DataTable和BindingSource绑定数据。

答案 4 :(得分:0)

我看到你正在尝试从另一个表单访问一个表单的网格。确保正确获得表单(带网格的表单)的引用,并使用它来引用网格。要实现这一点,您可能必须将您的网格对象公开为public。

在父表单中显示网格的属性

public GridView Grid
{
    return dataGridView1;
}

..当您启动新表单(比如ChildForm)时,请执行此操作

Form child = new ChildForm(this);
child.Show();

请更改您的子表单以使用构造函数参数。

private Form m_ParentForm;
public ChildForm(Form child)
{
   m_ParentForm = child;
}

..你的循环看起来像这样

for (int i = 0; i < m_ParentForm.Grid.Rows.Count; i++)

希望这有帮助。