我真的被困了,没有书籍或者这里的用户友好,足以解释如何使用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
答案 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}。
在一周左右的时间内,我将发布一个分步指南,介绍如何为这个空间创建一个简单的数据库。