如何删除行datagrid并更新SQL数据库C#

时间:2016-01-30 19:00:52

标签: c# datagrid delete-row

我真的被困了,没有书籍或者这里的用户友好,足以解释如何使用C#从数据网格对象中删除数据

来自不同的书籍和4m线程我设法得到这个编码,但它无法执行sql命令,我有一个表调用' SpellingList'两列一个是ID,另一个是单词,我想要做的就是从数据网格中删除一行。

有人能指出我正确的方向,一旦我解决了这个问题,我将上传一些基本的易于学习的教程,以便新手的其余部分可以遵循这个例子。

我使用了这个帖子How to delete a selected DataGridViewRow and update a connected database table?

和MCSD Certificaiton Toolkit考试70-483书籍第392页,所有尝试都失败了。

如果我注释掉if(dataGridView1.SelectedRows.Count> 0)行,这里有一个catch 22,我得到的索引超出范围错误。

private void btnDelete_Click(object sender, EventArgs e)
{
     // My SQL connectionString 
         SqlConnection myConnection = new SqlConnection("Data Source=Epic-LaptopWR;Initial Catalog=words;Integrated Security=True");
        myConnection.Open();


        foreach (DataGridViewCell oneCell in dataGridView1.SelectedCells)
        {

            if(dataGridView1.SelectedRows.Count > 0)
            {
                 int selectedIndex = dataGridView1.SelectedRows[0].Index;
                // gets the RowID from the first column in the grid
                int rowID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString());

                 // your code for deleting it from the database
                string sql = "DELETE FROM SpellingList WHERE Words =" + selectedIndex;
                SqlCommand deleteRecord = new SqlCommand();
                 deleteRecord.Connection = myConnection;
                 deleteRecord.CommandType = CommandType.Text;
                 deleteRecord.CommandText = sql;

                 SqlParameter RowParameter = new SqlParameter();
                 RowParameter.ParameterName = "@Words";
                 RowParameter.SqlDbType = SqlDbType.Int;
                 RowParameter.IsNullable = false;
                 RowParameter.Value = rowID;

                deleteRecord.Parameters.Add(RowParameter);

                deleteRecord.Connection.Open();

                deleteRecord.ExecuteNonQuery();
               if (oneCell.Selected)
                 dataGridView1.Rows.RemoveAt(oneCell.RowIndex);
                deleteRecord.Connection.Close();

                wordsDataSet.GetChanges();
                // booksDataset1.GetChanges();
                spellingListTableAdapter.Fill(wordsDataSet.SpellingList);
            }// end of if 

            // then your code for refreshing the DataGridView
        }// end of for each statement 
        myConnection.Close();

}// end of delete Button 

2 个答案:

答案 0 :(得分:2)

我们可以简化很多。并修复一些明显的错误。

ID字段是表的关键字段,因此您应该使用它来查找要删除的行,然后,一个有用的参数需要在您要执行的命令文本中使用参数占位符

private void btnDelete_Click(object sender, EventArgs e)
{
     // No row selected no delete....
     if(dataGridView1.SelectedRows.Count == 0)
         return; // show a message here to inform

     // Prepare the command text with the parameter placeholder
     string sql = "DELETE FROM SpellingList WHERE ID = @rowID";

     // Create the connection and the command inside a using block
     using(SqlConnection myConnection = new SqlConnection("...."))
     using(SqlCommand deleteRecord = new SqlCommand(sql, myConnection))
     {
        myConnection.Open();

        int selectedIndex = dataGridView1.SelectedRows[0].Index;
        // gets the RowID from the first column in the grid
        int rowID = Convert.ToInt32(dataGridView1[0, selectedIndex].Value);

        // Add the parameter to the command collection
        deleteRecord.Parameters.Add("@rowID", SqlDbType.Int).Value = rowID;
        deleteRecord.ExecuteNonQuery();

        // Remove the row from the grid
        dataGridView1.Rows.RemoveAt(selectedIndex);
    }
}

正如您所看到的,连接和命令是一次性对象,应该包含在using语句中,以确保在异常的情况下正确关闭和处理。

最后,从网格中删除行应该只使用行的索引,在单个命令中删除行。您不需要循环遍历单元格以逐个删除它们。

答案 1 :(得分:0)

我会谦虚地感谢史蒂夫的贡献,没有像他这样的老师,新手们会花费数小时的时间来解决一个简单而复杂的问题。

这是通过传递索引超出绑定错误的几个修改的工作代码:

private void btnDelete_Click(object sender, EventArgs e)
    {

            // No row selected no delete....
           if(dataGridView1.SelectedRows.Count == 0)
           {

               MessageBox.Show("No row selected !");// show a message here to inform
           }


            // Prepare the command text with the parameter placeholder

           string sql = "DELETE FROM SpellingList WHERE ID = @rowID";


            // Create the connection and the command inside a using block
         using(SqlConnection myConnection = new SqlConnection("Data Source=Epic-LaptopWR;Initial Catalog=words;Integrated Security=True"))
         using (SqlCommand deleteRecord = new SqlCommand(sql, myConnection))
         {
             myConnection.Open();

             MessageBox.Show("The SQL Connection is Open");

             // this overcomes  the out of bound error message 
             // if the selectedRow is greater than 0 then exectute the code below.
             if(dataGridView1.CurrentCell.RowIndex > 0)
             {

                int selectedIndex = dataGridView1.SelectedRows[0].Index;
                // gets the RowID from the first column in the grid
          int rowID = Convert.ToInt32(dataGridView1[0, selectedIndex].Value);

                 // Add the parameter to the command collection
          deleteRecord.Parameters.Add("@rowID", SqlDbType.Int).Value = rowID;
          deleteRecord.ExecuteNonQuery();

                // Remove the row from the grid
                dataGridView1.Rows.RemoveAt(selectedIndex);
             }

         }

    }// end of delete Button 

请确保SelectionMode的datagrid属性设置为' FullRowSelect'这将由史蒂夫提及将填充选定的行。

除了上面这是针对新手的,请确保你将主键设置为带有整数值的ID,在我的第一个错误中我没有主键中的任何数据它是一个字段为NULL {Colum叫做Words}。

在一周左右的时间内,我将发布一个分步指南,介绍如何为这个空间创建一个简单的数据库。