CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

DataGrid 中 编辑、更新、删除问题,100分求!

楼主xxxxxggg(看世界小小)2005-06-02 11:37:07 在 .NET技术 / ASP.NET 提问

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

相关问题

  • DataGrid中如何进行删除、更新、编辑等呢?(C#)
  • C#,winform中dataGrid控件如何进行更新 编辑 删除操作
  • 关于DATAGRID中的编辑、更新、取消、删除怎样实现
  • DataGrid上的更新、删除问题?
  • DataGrid里面属性生成器的按钮列怎么使用“编辑、更新、删除”功能?
  • DataGrid编辑、更新问题
  • DataGrid中的更新和删除如何操作?
  • c#中datagrid如何实现删除和插入,更新操作
  • webfrom下的DataGrid的用法(添加、更新、删除的操作)。
  • 我在datagrid中绑定了删除按纽提示事件,编辑状态后更新就丢失提示事件

关键词

  • 型号
  • datagrid
  • 数据
  • 模板
  • 修改
  • 删除
  • 更新
  • textbox
  • dgdone
  • 根

得分解答快速导航

  • 帖主:xxxxxggg
  • xuehai001
  • brando_beat
  • hchxxzx
  • hchxxzx
  • liuqinglq
  • ye_zi
  • libinguest

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo