第四节:编辑数据
不知道各位在asp程序中是怎样来修改数据库记录的,反正我的做法是做一个列表,将所有的记录列出来,然后,在关键字段加上超级链接,然后在用户点击超链接后,将页面转发到一个新的编辑页面上。在那个时候,我多么想想编辑Excel表格那样就在自己的列表里修改我想修改的字段。然后,DataGrid就为我提供了这样的功能。在DataGrid中,可以通过属性生成器在数据列表的前面增加一个“编辑”操作列,即在每一条记录的前面(每一行)都会增加一个“编辑”的超链接,单击这个超链接,这一行就会变成可以编辑的,每个字段都会变成一个文本框,这时,操作列就会变成“更新”和“取消”。这是,我们只需要修改我们需要修改的数据,然后,单击更新保存程序就行了(更新事件当然要写代码了)。
主要的步骤如下:
首先,启动属性生成器(不知道怎么启动,就看看我前面的文章),然后,选择左侧的“列”,在右边的“可用列”中,我们展开“按钮列”,然后,选择“编辑、更新、取消”,单击“〉”按钮将其加入“选定列”,这样,我们的DataGrid就会自动增加一列。
然后,回到属性窗口,增加三个事件,一个是单击“编辑”链接后产生的事件EditCommand,一个是更新数据的事件,UpdateCommand,一个是取消事件,CancleCommand。
在EditCommand中加入代码,告诉程序,选择的这一行需要编辑:
private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex=(int)e.Item.ItemIndex;//告诉DataGrid第几行要编辑
BindGrid();//我在第一节写的函数,这里不重复了
}
完成了这段代码,你就会发现,它会乖乖地按照你的指令将你选择的这一行变成可编辑的。但是,当你单击“更新”、“取消”链接的时候,它并不理睬你。这是因为,我们还没有为这两个事件编写代码,我们先来写“取消”的代码:
private void DataGrid1_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex=-1;//将-1传递给DataGrid的EditItemIndex属性,它就会回到只读状态
BindGrid();
}
简单的事情,做完了,我们在来做最负责的事情——更新数据:
//由于例子程序丢了,这里重新作了一个
private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
String updateCmd = "UPDATE Authors SET au_id = @Id, au_lname = @LName, au_fname = @FName, phone = @Phone, "
+ "address = @Address, city = @City, state = @State, zip = @Zip, contract = @Contract where au_id = @Id";
//应该了解ADO.net中的参数化编程吧
SqlCommand myCommand = new SqlCommand(updateCmd, myConnection);
myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 11));
myCommand.Parameters.Add(new SqlParameter("@LName", SqlDbType.NVarChar, 40));
myCommand.Parameters.Add(new SqlParameter("@FName", SqlDbType.NVarChar, 20));
myCommand.Parameters.Add(new SqlParameter("@Phone", SqlDbType.NChar, 12));
myCommand.Parameters.Add(new SqlParameter("@Address", SqlDbType.NVarChar, 40));
myCommand.Parameters.Add(new SqlParameter("@City", SqlDbType.NVarChar, 20));
myCommand.Parameters.Add(new SqlParameter("@State", SqlDbType.NChar, 2));
myCommand.Parameters.Add(new SqlParameter("@Zip", SqlDbType.NChar, 5));
myCommand.Parameters.Add(new SqlParameter("@Contract", SqlDbType.NVarChar,1));
myCommand.Parameters["@Id"].Value = MyDataGrid.DataKeys[(int)e.Item.ItemIndex];
//这个地方忘了告诉大家,我们必须在DataGrid中设置DataKeyField属性,MyDataGrid.DataKeys[(int)e.Item.ItemIndex]才能取得想要的关键字
int numCols = e.Item.Cells.Count;
for (int i=2; i<numCols-1; i++) //skip first, second and last column
{
String colvalue =((System.Web.UI.WebControls.TextBox)e.Item.Cells[i].Controls[0]).Text;
//中间你最好加上输入验证,然后再执行下列语句赋值给参数。
myCommand.Parameters[cols[i-1]].Value = colvalue;
}
myCommand.Connection.Open();
try
{
//更新数据
myCommand.ExecuteNonQuery();
//恢复只读状态
MyDataGrid.EditItemIndex = -1;
}
catch (SqlException exc)
{
//出错处理
}
myCommand.Connection.Close();
BindGrid();//重新绑定数据,用的还是我原来写的那样的函数
}
好了,我们的工作做完了,这段代码看上去很长,其实,是因为它用了比较多的字段,所以要用比较多的参数,我把关键部分用红字标出来了。其实还是很简单的。