DataGrid 中 编辑、更新、删除问题,100分求!
DataGrid 数据集名:DataGrid_Instrument
选出的数据样式如下:
原来: 点编辑后:
名称 型号 单位 数量 编辑 删除 名称 型号 单位 数量 编辑 删除
1 1 根 1 编辑 删除 1 1 根 1 更新 取消 删除
3 2 根 2 编辑 删除 3 2 根 2 更新 取消 删除
3213 L 支 100 编辑 删除 3213 L 支 100 更新 取消 删除
5 2 根 2 编辑 删除 5 2 根 2 更新 取消 删除
5fgdg M 根 5 编辑 删除 5fgdg M 根 5 更新 取消 删除
图1 图2
使用了模板,其中(文本框名)
名称:TextBox_Name
型号:TextBox_Type
单位:TextBox_Unit
数量:TextBox_Num
数量库表格中的主键:名称+型号
现在要点击 编辑到图2的状态,然后修改“名称”、“型号”、“单位”、“数量”里的数值
比如修改第2行数据为:23 22 支 20 更新 取消 删除
然后点击更新,使DataGrid_Instrument 里的数据变为图3
名称 型号 单位 数量 编辑 删除
1 1 根 1 编辑 删除
23 22 支 20 编辑 删除
3213 L 支 100 编辑 删除
5 2 根 2 编辑 删除
5fgdg M 根 5 编辑 删除
图3
因为我要取到未列新之前的(名称、型号)值,还有更新后的(名称、型号、单位、数量)值
将这六个数据传到数据库里才能实现更新。
问题:怎么取到未更新前的那两个(名称[Name_old]、型号[Type_old])值?还有更新后的四个数据?
更新后的四个数量好像可以这样取到
Name =((TextBox)e.Item.Cells[1].FindControl("TextBox_Name")).Text;
Type =((TextBox)e.Item.Cells[2].FindControl("TextBox_Type")).Text;
Unit = ((TextBox)e.Item.Cells[3].FindControl("TextBox_Unit")).Text;
Num = Convert.ToInt32(((TextBox)e.Item.Cells[4].FindControl("TextBox_Num")).Text);
问题点数:100、回复次数:19Top
1 楼tbmlh(成林)回复于 2005-06-02 11:44:46 得分 0
MSDNTop
2 楼bobomouse(波波)回复于 2005-06-02 11:47:38 得分 0
在点“编辑”后先将以前得数据用ViewState存起来。Top
3 楼LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^)回复于 2005-06-02 11:50:21 得分 0
可以放2个隐藏域绑定需要取更新以前的字段Top
4 楼xuehai001(雪海)回复于 2005-06-02 12:00:56 得分 10
哦,你描述的很认真,看来很用心的。
你在单击“编辑”的时候,就将原来的值取出即可,可以暂时的放到两个全局变量中,以便在“更新”时候使用。
取值方法和你说的
Name =((TextBox)e.Item.Cells[1].FindControl("TextBox_Name")).Text;
Type =((TextBox)e.Item.Cells[2].FindControl("TextBox_Type")).Text;
一样,
注意一点:html中datagrid模板列中的各个TextBox,它的id一定要是TextBox_Name和TextBox_Type...其余雷同Top
5 楼brando_beat(Eの懒龙)回复于 2005-06-02 12:05:26 得分 10
可以放2个隐藏域绑定需要取更新以前的字段
Top
6 楼xxxxxggg(看世界小小)回复于 2005-06-02 12:21:44 得分 0
我用了 Session来存放,但运行时却出错了,
“/Labman/Webs”应用程序中的服务器错误。
--------------------------------------------------------------------------------
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
源错误:
行 134: DataGrid_Instrument.EditItemIndex =(int)e.Item.ItemIndex;
行 135: DataGrid_Instrument.DataBind();
行 136: Session["name_old"] = ((TextBox)e.Item.Cells[1].FindControl("TextBox_Name")).Text;
行 137: Session["type_old"] = ((TextBox)e.Item.Cells[2].FindControl("TextBox_Type")).Text;
行 138: }
源文件: c:\inetpub\wwwroot\labman\webs\xmgl\info.aspx.cs 行: 136
堆栈跟踪:
[NullReferenceException: 未将对象引用设置到对象的实例。]
Webs.xmgl.info.DataGrid_Instrument_EditCommand(Object source, DataGridCommandEventArgs e) in c:\inetpub\wwwroot\labman\webs\xmgl\info.aspx.cs:136
System.Web.UI.WebControls.DataGrid.OnEditCommand(DataGridCommandEventArgs e) +110
System.Web.UI.WebControls.DataGrid.OnBubbleEvent(Object source, EventArgs e) +466
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +26
System.Web.UI.WebControls.DataGridItem.OnBubbleEvent(Object source, EventArgs e) +106
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +26
System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +121
System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +115
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +138
System.Web.UI.Page.ProcessRequestMain() +1277
点编辑时,用
Name =((TextBox)e.Item.Cells[1].FindControl("TextBox_Name")).Text;
Type =((TextBox)e.Item.Cells[2].FindControl("TextBox_Type")).Text;
根本就取不到值,Top
7 楼hchxxzx(NET?摸到一点门槛)回复于 2005-06-02 12:36:07 得分 10
因为我要取到未列新之前的(名称、型号)值,还有更新后的(名称、型号、单位、数量)值
----------------
这个问题,好像不用那么麻烦吧.
你的名称、型号两个字段并没有参与更新,所以你保将它们设置为"只读"(在属性生成器里面),然后,直接取它们的值就是了(在UPDATE事件里面)
名称/型号 = this.datagrid1.Items[e.Item.ItemIndex].Cells[n].Text;
其他更新后的值 = ((TextBox)this.datagrid1.Items[e.Item.ItemIndex].FindControl("控件ID")).Text;
同时,要注意,DATAGRID控件的绑定,必须放在if(!this.IsPostBack)中,否则,每次页面提交,都会重新加载数据库的值,导致无法取得更新后的值.
Top
8 楼xxxxxggg(看世界小小)回复于 2005-06-02 12:46:19 得分 0
兄台啊: hchxxzx
我的名称、型号两个字段要参加更新的呀,更新后可能与原来完全两样,所有字段都要参与更新,
主键是名称+型号,但也要参与更新的,
在点编辑时怎么取到操作行中的任意字段的数据啊,求救啊,求救啊,求救啊,求救啊,求救啊,求救啊,求救啊,求救啊,求救啊,求救啊,求救啊,
这问题烦了我好几个星期了,5555555555555555555555555Top
9 楼ghchen()回复于 2005-06-02 12:53:13 得分 0
好强啊Top
10 楼hchxxzx(NET?摸到一点门槛)回复于 2005-06-02 13:04:46 得分 40
主键是名称+型号,但也要参与更新的,
---------
你这个数据库,设计得真是不合理.
你可以再生成一个主键字段,这样就不用如此麻烦了.假设你的数据库表中有6个字段如下
a,b,c,d,e,f
其中a就是你的名称,b就是你的型号,你现在用a,b做为主键,但两者又要参与更新,那么,你可以这样:
sql = "seect a&'|'&b as id,a,b,c,d,e,f from table";
就是自行构建一个虚拟的主键
然后,在绑定的时候,把上述SQL语句中的id做为你的主键
this.datagrid1.DataKeyField = "id";
这样,在update事件中,你尽管去取你的更新后的值,同时,取出主键值
string id = this.datagrid1.DataKeys[e.Item.ItemIndex].ToString();
然后,把ID值拆分一下就得到更新之前的名称与型号,你就可以放心地进行更新了.Top
11 楼xxxxxggg(看世界小小)回复于 2005-06-02 13:30:23 得分 0
好像数据库没弄好,唉,真郁闷!!!!!谢了,Top
12 楼xxxxxggg(看世界小小)回复于 2005-06-02 13:30:57 得分 0
我试试你的办法吧,不知道行不行,行了结贴啊,哈哈,Top
13 楼liuqinglq(白菜)回复于 2005-06-02 13:34:46 得分 10
模板列
对于名称和型号这两列
EditItemTemplate 中除了放TEXTBOX用于修改相应值之外
再放一个控件,比如LABEL,但是要是隐藏的,用于存放更新之前的值(也就是绑定后不变动)
这样就可以都取到更新前后的值了Top
14 楼ye_zi(行到水穷处·坐看云起时)回复于 2005-06-02 18:11:38 得分 10
可以把以前的数据存在数组里或是像楼上所说拖个隐藏的控件Top
15 楼kaixin110(kydk.com)回复于 2005-06-02 18:24:08 得分 0
SHM YATop
16 楼50277(柳影随风)回复于 2005-06-02 22:09:56 得分 0
顶Top
17 楼libinguest(上善若水)回复于 2005-06-02 23:15:10 得分 10
private void dgdone_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
this.dgdone.EditItemIndex=e.Item.ItemIndex;
this.DataBind();
}
private void dgdone_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
this.dgdone.EditItemIndex=-1;
this.DataBind();
}
private void dgdone_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
// string str=((TextBox)e.Item.Cells[2].Controls[0]).Text;
// Response.Write(str);
// Response.Write(str1);
// Response.Write(str2);
// SqlConnection conn=new SqlConnection("server=LIBIN;database=stu_info;uid=sa;pwd=1129");
// SqlCommand cmd=new SqlCommand("proupdate",conn);
// cmd.CommandType=CommandType.StoredProcedure;
// cmd.Parameters.Add("@id",SqlDbType.Int,4).Value=Convert.ToInt32(str);
// str=((TextBox)e.Item.Cells[3].Controls[0]).Text;
// cmd.Parameters.Add("@name",SqlDbType.VarChar,20).Value=str;
// str=((TextBox)e.Item.Cells[4].Controls[0]).Text;
// cmd.Parameters.Add("@pwd",SqlDbType.VarChar,20).Value=str;
// conn.Open();
// cmd.ExecuteNonQuery();
// this.dgdone.EditItemIndex=-1;
// conn.Close();
// Query();
}
private void dgdone_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
// int x=Convert.ToInt32(dgdone.DataKeys[(int)e.Item.ItemIndex]);
// Response.Write(x);
// SqlConnection conn=new SqlConnection("server=LIBIN;database=stu_info;uid=sa;pwd=1129");
// SqlDataAdapter asd=new SqlDataAdapter();
// SqlCommand cmd=new SqlCommand("delete from usertable where userID=@id",conn);
// cmd.Parameters.Add("@id",SqlDbType.Int,4).Value=Convert.ToInt32(this.dgdone.DataKeys[(int)e.Item.ItemIndex]);
// asd.SelectCommand=cmd;
// DataSet ds=new DataSet();
// asd.Fill(ds);
// this.Query();
}Top
18 楼50277(柳影随风)回复于 2005-06-02 23:19:03 得分 0
http://community.csdn.net/Expert/topic/4052/4052496.xml?temp=2.454776E-02
Top
19 楼aliketen(继续学习NET!)回复于 2005-06-03 00:26:07 得分 0
upTop




