(原创)代码分析-DataGrid实现增删(带提示)改和分页


或许大家会说,网上已经很多类似文章了,包括孟子的,为什么要再写一次?
我想我们不仅仅要会实现,更多的是需要理解。
下面先帖出代码,再分析一下其中的一些关键代码。
数据库表名:tb1,其中有3个字段,分别是ID自增的主键、vName varchar(50)、iAge int
(以下代码没有做任何错误捕获处理)

前台

<%@ Page language="c#" Codebehind="WebForm5.aspx.cs" AutoEventWireup="false" Inherits="csdn.WebForm5" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
   
<HEAD>
       
<title>WebForm5</title>
       
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
       
<meta content="C#" name="CODE_LANGUAGE">
       
<meta content="JavaScript" name="vs_defaultClientScript">
       
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
   
</HEAD>
   
<body>
       
<form id="Form1" method="post" runat="server">
           
<asp:textbox id="TextBox1" runat="server" Width="88px"></asp:textbox>
           
<asp:TextBox id="TextBox2" runat="server" Width="40px"></asp:TextBox>
           
<asp:Button id="Button1" runat="server" Text="添加"></asp:Button>
           
<asp:datagrid id="DataGrid1" runat="server" AutoGenerateColumns="False" DataKeyField="ID" AllowPaging="True"
                PageSize
="5" OnEditCommand="edit" OnCancelCommand="cancel" OnUpdateCommand="update">
               
<Columns>
                   
<asp:TemplateColumn HeaderText="姓名">
                       
<ItemTemplate>
                           
<%# DataBinder.Eval(Container.DataItem,"vName") %>
                       
</ItemTemplate>
                       
<EditItemTemplate>
                           
<asp:TextBox id="name" Runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"vName") %>' Width="88px">
                           
</asp:TextBox>

                       
</EditItemTemplate>
                   
</asp:TemplateColumn>
                   
<asp:TemplateColumn HeaderText="年龄">
                       
<ItemTemplate>
                           
<%# DataBinder.Eval(Container.DataItem,"iAge") %>
                       
</ItemTemplate>
                       
<EditItemTemplate>
                           
<asp:TextBox id="age" Runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"iAge") %>' Width="40px">
                           
</asp:TextBox>

                       
</EditItemTemplate>
                   
</asp:TemplateColumn>
                   
<asp:EditCommandColumn UpdateText="更新" CancelText="取消" EditText="编辑"></asp:EditCommandColumn>
                   
<asp:ButtonColumn Text="删除" CommandName="del"></asp:ButtonColumn>
               
</Columns>
               
<PagerStyle Mode="NumericPages"></PagerStyle>
           
</asp:datagrid></form>
   
</body>
</HTML>

后台

  using System;
using
System.Collections;
using
System.ComponentModel;
using
System.Data;
using
System.Data.SqlClient;
using
System.Drawing;
using
System.Web;
using
System.Web.SessionState;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.HtmlControls;
namespace
csdn
{
   
/// <summary>
   
/// WebForm5 的摘要说明。
   
/// </summary>

    public class WebForm5 : System.Web.UI.Page
   
{
       
protected
System.Web.UI.WebControls.TextBox TextBox1;
       
protected
System.Web.UI.WebControls.TextBox TextBox2;
       
protected
System.Web.UI.WebControls.Button Button1;
       
protected
System.Web.UI.WebControls.DataGrid DataGrid1;
   
       
private void Page_Load(object
sender, System.EventArgs e)
       
{
           
// 在此处放置用户代码以初始化页面

            if(!IsPostBack)
           
{
                SetBind();
            }

        }


       
protected void SetBind()
       
{
            SqlConnection conn
=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"
]);
            SqlDataAdapter da
=new SqlDataAdapter("select * from tb1"
,conn);
            DataSet ds
=new
DataSet();
            da.Fill(ds,
"table1"
);
           
this.DataGrid1.DataSource=ds.Tables["table1"
];
           
this
.DataGrid1.DataBind();
        }


       
Web 窗体设计器生成的代码

       
private void Button1_Click(object sender, System.EventArgs e)
       
{
            SqlConnection conn
=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"
]);
            SqlCommand comm
=new SqlCommand("insert into tb1 (vName,iAge) values (@vName,@iAge)"
,conn);
            SqlParameter parm1
=new SqlParameter("@vName",SqlDbType.NVarChar,50
);
            parm1.Value
=this
.TextBox1.Text;
            SqlParameter parm2
=new SqlParameter("@iAge"
,SqlDbType.Int);
            parm2.Value
=this
.TextBox2.Text;
            comm.Parameters.Add(parm1);
            comm.Parameters.Add(parm2);
            conn.Open();
            comm.ExecuteNonQuery();
            conn.Close();
            SetBind();
        }


       
private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
       
{
           
if(e.CommandName=="del"
)
           
{
                SqlConnection conn
=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"
]);
                SqlCommand comm
=new SqlCommand("delete from tb1 where ID=@id"
,conn);
                SqlParameter parm1
=new SqlParameter("@id"
,SqlDbType.Int);
                parm1.Value
=this
.DataGrid1.DataKeys[e.Item.ItemIndex];
                comm.Parameters.Add(parm1);
                conn.Open();
                comm.ExecuteNonQuery();
                conn.Close();
                SetBind();
            }

        }


       
private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
       
{
           
this.DataGrid1.CurrentPageIndex=
e.NewPageIndex;
            SetBind();
        }


       
protected void edit(object sender,DataGridCommandEventArgs e)
       
{
           
this.DataGrid1.EditItemIndex=
e.Item.ItemIndex;
            SetBind();
        }


       
protected void cancel(object sender,DataGridCommandEventArgs e)
       
{
           
this.DataGrid1.EditItemIndex=-1
;
            SetBind();
        }


       
protected void update(object sender,DataGridCommandEventArgs e)
       
{
            SqlConnection conn
=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"
]);
            SqlCommand comm
=new SqlCommand("update tb1 set vName=@vName,iAge=@iAge where ID=@id"
,conn);
            SqlParameter parm1
=new SqlParameter("@vName",SqlDbType.NVarChar,50
);
            parm1.Value
=((TextBox)e.Item.FindControl("name"
)).Text;
            SqlParameter parm2
=new SqlParameter("@iAge"
,SqlDbType.Int);
            parm2.Value
=((TextBox)e.Item.FindControl("age"
)).Text;
            SqlParameter parm3
=new SqlParameter("@id"
,SqlDbType.Int);
            parm3.Value
=this
.DataGrid1.DataKeys[e.Item.ItemIndex];
            comm.Parameters.Add(parm1);
            comm.Parameters.Add(parm2);
            comm.Parameters.Add(parm3);
            conn.Open();
            comm.ExecuteNonQuery();
            conn.Close();
           
this.DataGrid1.EditItemIndex=-1
;
            SetBind();
        }


       
private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
       
{
           
foreach(DataGridItem di in this
.DataGrid1.Items)
           
{
               
if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem||di.ItemType==
ListItemType.EditItem)
               
{
                    ((LinkButton)di.Cells[
3].Controls[0]).Attributes.Add("onclick","return confirm('delete?');"
);
                }

            }

//一般不这么写,看下面说明第六点
        }

    }


(1)
大家可以看到SetBind()中的一些代码,并没有显式的打开和关闭SqlConnection但是代码确实是运作的,原因在于SqlDataAdqpter的Fill方法会自动打开或者关闭连接(当然它会先检测是不是连接已经打开,如果已经打开的话不会重复打开导致出错)。
(2)
再看一下Page_Load()中
if(!IsPostBack)
{
 SetBind();
}
很多初学者,不理解IsPostBack盲目的加或者不加这句话,其实加不加在于你的需求
IsPostBack为真的时候表示网页不是第一次加载也就是回传的情况
只有在!IsPostBack为真的时候用了SetBind();也就是绑定DataGrid的关键在于我们需要修改记录,这往往是很多网友在修改记录的时候发现向数据库写入的数据还是原来的TextBox中的内容。为什么会这样呢?在修改的时候我们先按下“编辑”这个按钮执行了protected void edit(object sender,DataGridCommandEventArgs e)里面的代码,在修改了TextBox中数据以后我们按下“更新”这个按钮,这个时候也是一次PostBack如果没有if(!IsPostBack)的话,其中的绑定代码执行了一次,也就是对模板列中的TextBox进行了重新赋值,然后转到
protected void update(object sender,DataGridCommandEventArgs e)中的代码,你的代码是执行的,但是((TextBox)e.Item.FindControl("name")).Text已经不是你修改的东西而是原来的东西了。
(3)
修改的代码中
parm3.Value=this.DataGrid1.DataKeys[e.Item.ItemIndex]
对于e.Item.ItemIndex就是点击的这个行(事件触发的行)的行好,如果要用这个作为主键来放进where子句update或者delete显然是不合适的,比如你点击的是第三行,数据库内这个记录的主键却是20或者是字符,因此我们需要为DataGrid指定一个DataKeyField(前台代码中)告诉它,我的表的主键就是这个字段,在绑定了以后DataGrid的DataKeys就存储数据了列表控件中每个记录的主键,所以取的时候用索引
this.DataGrid1.DataKeys[e.Item.ItemIndex]来取就可以得到主键
(4)
看一下private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
中的一些代码,首先ItemCreated这个事件是在当在DataGrid控件中创建项时在服务器上发生,这个时候还没有绑定数据,所以如果在这个
ItemCreated中去取DataGrid中的值你是得不到的。
foreach(DataGridItem di in this.DataGrid1.Items)
{
if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem||di.ItemType==ListItemType.EditItem)
{
((LinkButton)di.Cells[3].Controls[0]).Attributes.Add("onclick","return confirm('delete?');");//这里的类型转换为LinkButton,在不指定ButtonColumn 的ButtonType的时候默认就是LinkButton,如果指定为PushButton,这里类型转换应该写Button而不是LinkButton否则会出错
}
}
这段代码为所有的删除按钮增加客户端的click事件,在循环所有的DataGrid1.Items的时候我们注意到,仅仅需要在ListItemType.Item和ListItemType.AlternatingItem中的第四列(Cells[3])中的第一个按钮控件(Controls[0])上添加属性,因为在DataGrid的Header或者Footer中是找不到这个删除按钮的(虽然他们也是DataGrid1.Items)。设想一下如果不写di.ItemType==ListItemType.EditItem会怎么样?结果就是在编辑的时候按删除那个时候是没有提示的,因为没有给编辑的行的按钮加脚本。说到这里想说一下对这个程序的改进,大家或许不想在编辑的时候允许删除操作(也就是点击了编辑按钮却没有点击取消或者更新按钮的时候是不运行删除操作),改进方法很简单:把e.CommandName=="del"这个判断改为e.CommandName=="del"&&e.Item.ItemType!=ListItemType.EditItem,就可以达到这个目的了。
还有之所以在这里没有用((LinkButton)di.Cells[3].FindControl(删除按钮的id))来找到这个按钮是因为这个按钮如果不写是 <asp:ButtonColumn Text="删除" CommandName="del"></asp:ButtonColumn>不能添加id的,如果这个按钮是放在模板列中的,就可以有id了。
(5)
在编辑的时候
this.DataGrid1.EditItemIndex=e.Item.ItemIndex在取消编辑的时候this.DataGrid1.EditItemIndex=-1
当EditItemIndex!=-1的时候,DataGrid显示的东西不再是ItemTemplate中的东西而是EditItemTemplate中的东西,所以在取消编辑的时候设定-1就可以了,同样EditItemIndex和ItemIndex差不多是从0开始编号,表示的是编辑的这一行的索引号。
(6)
foreach(DataGridItem di in this.DataGrid1.Items)
            {
                if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem||di.ItemType==ListItemType.EditItem)
                {
                    ((LinkButton)di.Cells[3].Controls[0]).Attributes.Add("onclick","return confirm('delete?');");
                }
            }
        }

这段代码我为了演示如果不对ItemType进行判断会出错,所以对DataGrid1.Items进行了循环读取(可以通过调试看到当在设置了Footer以后DataGrid1.Items.Count>PageSize),一般情况下这么写就可以了
if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem||e.Item.ItemType==ListItemType.EditItem)
    {
     ((LinkButton)e.Item.Cells[3].Controls[0]).Attributes.Add("onclick","return confirm('delete?');");
    }


暂时先说到这里,以后继续补充。

posted @ 2005-03-25 13:10 lovecherry 阅读(22721) 评论(59)  编辑 收藏 网摘 所属分类: webform

  回复  引用  查看    
#1楼[楼主]2005-03-28 17:36 | heh      
经典的文章,感谢楼主,学到了!
  回复  引用  查看    
#2楼[楼主]2005-03-31 08:02 | lovecherry      
:)
  回复  引用    
#3楼2005-04-04 01:16 | hanbb
好东西,谢谢楼住~
  回复  引用    
#4楼2005-04-04 23:24 | 我是初学者
da.Fill(ds,"table1");
this.DataGrid1.DataSource=ds.Tables["table1"];
这里的table1是不是上面的tbl1

  回复  引用  查看    
#5楼[楼主]2005-04-05 06:59 | lovecherry      
是的
  回复  引用    
#6楼2005-04-22 13:28 | 克格勃
一定责任都不负
  回复  引用    
#7楼2005-05-10 14:21 | 过客
惊叹!
  回复  引用    
#8楼2005-05-11 16:01 | 李青松
怎么该例子的删除功能没有实现啊?请教一下,删除表格中某行的数据有几种方法?可否给出例子?我的邮箱是firecannonman@163.com
  回复  引用    
#9楼2005-05-12 16:57 | 起起
实现不了!
  回复  引用    
#10楼2005-05-15 22:16 | aa
是呀,没法实现呀,请教为啥呀
  回复  引用  查看    
#11楼[楼主]2005-05-16 06:50 | lovecherry      
错误提示?
  回复  引用    
#12楼2005-06-19 16:18 | jim[未注册用户]
个人观点,写的还是不错的,
修改一下就可以了
protected void SetBind()
{
SqlConnection conn=new SqlConnection(strconn);
SqlDataAdapter da=new SqlDataAdapter("select * from tb1",conn);
DataSet ds=new DataSet();
da.Fill(ds,"table1"); //ds.Tables["table1"].Rows.Count
this.DataGrid1.DataSource=ds.Tables["table1"];
while(this.DataGrid1.CurrentPageIndex*this.DataGrid1.PageSize >= ds.Tables["table1"].Rows.Count)
{
if(this.DataGrid1.CurrentPageIndex == 0)
{
break;
}
this.DataGrid1.CurrentPageIndex--;

}

this.DataGrid1.DataBind();

  回复  引用    
#13楼2005-06-19 16:24 | jim
另外斑竹,问一个初级的问题,请指教,邮箱:gopojim@163.com
System.Configuration.ConfigurationSettings.AppSettings["conn"]
是取值,但我如何设置值,
我写成System.Configuration.ConfigurationSettings.AppSettings.Add("conn","连接串");
执行时提示:异常详细信息: System.NotSupportedException: 集合是只读的。

  回复  引用    
#14楼2005-06-25 15:05 | 松鼠[未注册用户]
请问在什么时侯 DataGrid控件的分页导航按钮不会显视在一行?

我遇到了这个问题,我是把DataGrid控件放在一个层里面,发现里面的分页导航按钮没有显视在一行,不管我是用数字还是符号!
而且点击下一行时,必须在响应分页命令里重新连接数据库,重新执行命令,才能实现分页,不然提示什么对象没有实例话!

我的DataAdapter和DataSet还有连接对象都是全局的!

  回复  引用    
#15楼2005-06-27 07:56 |
不错,是好东西.学习!
  回复  引用    
#16楼2005-06-27 14:51 | xiao*P
这么好的东西还有人说三道四的
真不理解……~……~
哪里运行不了 的
仔细看看……~……~……~

经典的好东西应该顶

  回复  引用    
#17楼2005-07-11 10:46 | 敬亭山[未注册用户]
很好呀!
  回复  引用    
#18楼2005-07-11 11:07 | ss[未注册用户]
没有图片所显示的结果,,瞎说
  回复  引用    
#19楼2005-08-17 17:00 | 纤手[未注册用户]
请问:在运行时为什么会出现“不可访问“Web8._16.WebIE1.cancel(object, System.Web.UI.WebControls.DataGridCommandEventArgs)”,因为它受保护级别限制”我的邮箱是hyw2178@163.com

  回复  引用    
#20楼2005-08-17 17:00 | 纤手[未注册用户]
请问:在运行时为什么会出现“不可访问“Web8._16.WebIE1.cancel(object, System.Web.UI.WebControls.DataGridCommandEventArgs)”,因为它受保护级别限制”我的邮箱是hyw2178@163.com

  回复  引用    
#21楼2005-08-17 17:12 | 纤手[未注册用户]
这篇文章写的非常好,但是试了好几次,涛声依旧。。。惨hyw2178@163.com


  回复  引用    
#22楼2005-08-17 17:19 | 纤手[未注册用户]
这篇文章写的非常好,但是试了好几次,涛声依旧。。。惨请指点 ......请指点 我的邮箱是hyw2178@163.com


  回复  引用    
#23楼2005-08-24 09:28 | rhy新手,谢谢![未注册用户]
不好意思,还想请教一下,为什么点击第二页的时候,整个datagrid都小时不在显示了?

前台:

<asp:datagrid id="DataGrid1" runat="server" Height="60px" Width="700px" OnDeleteCommand="Mession_Delete"
OnEditCommand="Mession_Edit" OnCancelCommand="Mession_Cancel" OnUpdateCommand="Mession_Update"
AutoGenerateColumns="False" PageSize="2" HorizontalAlign="Left" BorderStyle="None" BorderWidth="1mm"
BorderColor="Linen" ShowFooter="True" AllowPaging="True">

后台:

protected void SetBind1(string milestoneId)
{
//查询里程碑任务列表
ProjectWeeklyReport pwReport = new ProjectWeeklyReport();
DataTable dt1 = pwReport.GetMessionInfoList(milestoneId);
this.DataGrid1.DataSource = dt1;
this.DataGrid1.DataBind();
}


private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
log.Info("PageIndex");
DataGrid1.DataBind();
}

  回复  引用    
#24楼2005-08-24 09:31 | rhy新手,谢谢![未注册用户]
消失!
  回复  引用    
#25楼2005-08-24 09:46 | rhy新手,谢谢![未注册用户]
谢谢了,自己解决了,绑定出的问题!谢谢~~
  回复  引用    
#26楼2005-09-28 15:34 | lfcoolwind[未注册用户]
不错啊
  回复  引用    
#27楼2005-09-29 09:05 | winter[未注册用户]
感谢楼主,我顶了,现又有一类似问题请教,请高手们指点,,,
我在用DataGrid分页的时候DataGrid1_PageIndexChanged事件根本就没执行,用断点看到的,在HTML文件里加上OnPageIndexChanged=DataGrid1_PageIndexChanged后,竟然告诉我是受保护级别限制,不能执行,我晕,怎么解决啊,我还用了DataGrid的自定义列,应该不会是它影响的吧,DataGrid的自动分页功能还需要其他什么特殊设置吗???

  回复  引用    
#28楼2005-10-06 22:01 | 国鹏[未注册用户]
第三条中
----因此我们需要为DataGrid指定一个DataKeyField(前台代码中)告诉它---
这个怎么在前台代码中指定,
我测试的问题也在这里
----------------------------------------------------------------------------------
索引超出范围。必须为非负值并小于集合大小。参数名: index
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名: index

源错误:


行 116: cmd.Parameters["@vName"].Value=((TextBox)e.Item.FindControl("name")).Text;
行 117: cmd.Parameters["@iAge"].Value=((TextBox)e.Item.FindControl("age")).Text;
行 118: cmd.Parameters["@id"].Value=this.DataGrid1.DataKeys[e.Item.ItemIndex];
行 119: conn.Open();
行 120: cmd.ExecuteNonQuery();
-----------------------------------------------------------------------------------------

其他的都没有问题,就是在更新和删除的时候,ID值这里出现问题,不知道怎么解决

  回复  引用    
#29楼2005-10-17 19:02 | 小怪物地狼[未注册用户]
编译的时候前台的程序里面显示<%...# DataBinder.Eval(Container.DataItem,"vName") %>出现错误标记不能正常使用是怎么回事呢?

编译错误
说明: 在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。

编译器错误信息: CS1040: 预处理器指令必须作为一行的第一个非空白字符出现

源错误:



行 19: <asp:TemplateColumn HeaderText="姓名">
行 20: <ItemTemplate>
行 21: <%...# DataBinder.Eval(Container.DataItem,"vName") %>
行 22: </ItemTemplate>
行 23: <EditItemTemplate>


源文件: http://localhost/Chapter3-1/WebForm1.aspx 行: 21

  回复  引用    
#30楼2005-10-19 13:34 | 天仇[未注册用户]
2005-10-06 22:01 国鹏
你要在datagrid里的属性中把DataKeyField里写上 id
2005-10-17 19:02 小怪物地狼
<%...# DataBinder.Eval(Container.DataItem,"vName") %>改成
<%# DataBinder.Eval(Container.DataItem,"vName") %>

我的疑问:在datagrid里OnUpdateCommand="update" OnEditCommand="edit" OnCancelCommand="cancel" 这三个有分别对应的函数,他们可以像button那样双击就出来private void Button1_Click(object sender, System.EventArgs e){} 这样函数的框架吗?

  回复  引用    
#31楼2005-10-19 13:37 | 天仇[未注册用户]
2005-10-06 22:01 国鹏
你要在datagrid里的属性中把DataKeyField里写上 id
2005-10-17 19:02 小怪物地狼
<%...# DataBinder.Eval(Container.DataItem,"vName") %>改成
<%# DataBinder.Eval(Container.DataItem,"vName") %>

我的疑问:在datagrid里OnUpdateCommand="update" OnEditCommand="edit" OnCancelCommand="cancel" 这三个有分别对应的函数,他们可以像button那样双击就出来private void Button1_Click(object sender, System.EventArgs e){} 这样函数的框架吗? 要是有的话怎么操作

  回复  引用    
#32楼2005-11-28 13:31 | dany_liufu[未注册用户]
请问各位:
如果想在删除数据之前,怎么在 if(e.CommandName=="del") {...}
里面增加一个对话框来询问用户是否确定删除该数据呢?谢谢!!

  回复  引用    
#33楼2005-12-01 21:51 | 大狗[未注册用户]
茅塞顿开!
  回复  引用    
#34楼2006-05-29 15:00 | lxwwf1[未注册用户]
学到了,是很好的列子,谢谢您的贡献。

可是能不能就del说说呢?谢谢

  回复  引用    
#35楼2006-09-04 15:19 | 凌[匿名][未注册用户]
好东西呀
不知道搂主能不能指点一下Panel的用法
我想清空Panel中子控件TextBox、DropDownList的内容
不知道怎么办

  回复  引用    
#36楼2006-10-19 10:13 | GIS小财[未注册用户]
学到东西了!!谢谢
  回复  引用    
#37楼2006-10-29 17:27 | 风轻扬[匿名][未注册用户]
好例子
谢谢斑竹!

  回复  引用    
#38楼2007-03-28 14:12 | 田笑[未注册用户]
private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string productID=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
string productPrice=((TextBox)(e.Item.Cells[2].Controls[0])).Text;
// Response.Write(productID+"&"+productPrice);
SqlConnection con=DB.createCon();
SqlCommand cmd=new SqlCommand("update product where productID='"+productID+"',con");
con.Open();
cmd.ExecuteNonQuery();
this.DataGrid1.EditItemIndex=-1;
this.BindToDataGrid();
}

ExecuteNonQuery: Connection 属性尚未初始化。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidOperationException: ExecuteNonQuery: Connection 属性尚未初始化。

源错误:


行 132: SqlCommand cmd=new SqlCommand("update product where productID='"+productID+"',con");
行 133: con.Open();
行 134: cmd.ExecuteNonQuery(); 这里出错!!
行 135: this.DataGrid1.EditItemIndex=-1;
行 136: this.BindToDataGrid();

请高手指点下..


  回复  引用    
#39楼2007-07-17 14:31 | 租车[未注册用户]
好难啊>>
http://www.htte.cn/ 电炉 网
http://www.dianlu.sh.cn/ 电炉 网
http://www.zingfull.com/ 办公室装修
http://www.bianyaqi.sh.cn/ 电抗器
http://www.bianyaqi.sh.cn/ 干式变压器

  回复  引用    
#40楼2008-02-28 23:29 | 52楼[未注册用户]
如果是有money类型和image类型的字段呢?
  回复  引用    
#41楼2008-03-05 10:18 | sdg[未注册用户]
  回复  引用    
#42楼2008-04-16 09:41 | qiang88881[未注册用户]
www.511811.com厂房装修
www.511811.com门面装潢
www.zingfull.com厂房装修
www.zingfull.com门面装潢

  回复  引用    
#43楼2008-04-16 09:42 | qiang8888123[未注册用户]
http://www.zingfull.com/ 办公室装修
http://www.511811.com/ 办公室装修
http://www.511811.com/ 办公室装修

  回复  引用    
#44楼2008-04-19 21:11 | 多谢你[未注册用户]
好感激你的第六点建议····问题已经解决··多谢大侠··
  回复  引用    
#45楼2008-07-04 23:33 | 上海租车[未注册用户]
不错不错 学习



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 125487




相关文章:

相关链接: