为什么我总是无法取得一个DataGrid中的可编辑框中的新值?
我用了下面一个DataGrid,想编辑里面的“时间”一项,点击“修改”后,时间项变成可编辑的,但当我改了Textbox中的值后,点“保存”,却发现取出的总是原来没改过的值,请问是哪不对啊?
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<Script language="C#" runat="server">
……
public void BindData(){
……
}
public void DBItemEdit(Object sender,DataGridCommandEventArgs e){
LC_GZ.EditItemIndex = e.Item.ItemIndex;
BindData();
}
public void DBItemCancel(Object sender,DataGridCommandEventArgs e){
LC_GZ.EditItemIndex = - 1;
BindData();
}
public void DBItemUpdate(Object sender,DataGridCommandEventArgs e){
string StrGZID=e.Item.Cells[0].Text;
TextBox NTime=(TextBox)(e.Item.Cells[3].Controls[0]);
……就是这里,为什么NTime.Text总是原来那个值?
Response.Write(NTime.Text);
OleDbConnection Cn=new OleDbConnection(DataConnectionString);
OleDbCommand Cmd=new OleDbCommand();
Cmd.Connection=Cn;
Cmd.Connection.Open();
Cmd.CommandType=CommandType.StoredProcedure;
Cmd.CommandText="LC_MOD_Single"; //(@P_GCCODE,@P_GZID,@P_NEW_TIME,@P_Op_Name)";
Cmd.Parameters.Add("@P_GCCODE",StrGccode);
Cmd.Parameters.Add("@P_GZID",StrGZID);
Cmd.Parameters.Add("@P_NEW_TIME",NTime.Text);
Cmd.Parameters.Add("@P_Op_Name","");
Cmd.ExecuteNonQuery();
LC_GZ.EditItemIndex=-1;
BindData();
Cn.Close();
}
</Script>
<html>
<head>
</head>
<body>
<form runat="server">
<table>
<asp:DataGrid ID="LC_GZ" Runat="server" AllowPaging=False CellSpacing=0 CellPadding=5 AutoGenerateColumns=false Font-Size=13px
OnEditCommand="DBItemEdit" OnCancelCommand="DBItemCancel" OnUpdateCommand="DBItemUpdate">
<EditItemStyle BackColor="#FFFFEE">
</EditItemStyle>
<columns>
<asp:BoundColumn HeaderText="GZID" DataField="GZID" visible=false ReadOnly />
<asp:BoundColumn HeaderText="工作" DataField="GZName" ReadOnly/>
<asp:BoundColumn HeaderText="操作" DataField="DispName" ReadOnly />
<asp:BoundColumn HeaderText="时间" DataField="E_Time" />
<asp:TemplateColumn>
<ItemTemplate><img src='../images/fx2.gif' height=25></ItemTemplate>
</asp:TemplateColumn>
<asp:EditCommandColumn EditText="修改" CancelText="取消" UpdateText="保存" ItemStyle-Wrap="false" HeaderText="修改" HeaderStyle-Wrap="false"/>
</Columns>
</asp:DataGrid>
</form>
</body>
</html>
问题点数:20、回复次数:9Top
1 楼AllenTing(今天你GC了吗???)回复于 2005-02-01 15:02:02 得分 6
问题在这:
<asp:BoundColumn HeaderText="时间" DataField="E_Time" />
你定义的是boudcolumn,改用templatecolumn:
<asp:templatecolumn>
<itemTemplate>
...
</itemTempate>
<editTemplate>
<asp:textbox id="name" text=".." runat="Server" />
</editTemplate>
</asp:templatecolumn>Top
2 楼ynduanlian(进一步海阔天高,退一步粉身碎骨)回复于 2005-02-01 15:08:29 得分 0
不是吧,我以前也用Bindcolumn,能改啊?Top
3 楼AllenTing(今天你GC了吗???)回复于 2005-02-01 15:12:35 得分 0
那你试试吧Top
4 楼wanghaijun240(WHJ)回复于 2005-02-01 15:13:28 得分 7
PageLode事件里面这样调用BindData()方法:
if(!Page.IsPostback)
{
BindData();
}Top
5 楼spland(spland)回复于 2005-02-01 15:14:36 得分 1
AllenTing(我爱吃醋) 说的没错
修改的内容用templatecolumn,你试一下就知道了Top
6 楼ynduanlian(进一步海阔天高,退一步粉身碎骨)回复于 2005-02-01 15:20:28 得分 0
贴出全部代码:
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<Script language="C#" runat="server">
public string StrGccode;
public string DataConnectionString="Provider=MSDAORA;Data Source=kmtdb4;User ID=kmtdb4;Password=kmtdb4";
public void Page_Load(Object sender,EventArgs e){
StrGccode=Request.QueryString["GCCODE"];
BindData();
}
public void BindData(){
StringBuilder Sb=new StringBuilder();
Sb.Append("select LC_PRJGZ.GZID,LC_PRJGZ.GZNAME,LC_PRJRECORD.B_TIME,LC_PRJRECORD.E_TIME,PRJ_XTUSER.UserID ,PRJ_XTUSER.USERNAME ,PRJ_XTUSER.dispname,LC_MOD_PRJRECORD_BAK.E_TIME ");
Sb.Append(" from LC_PRJGZ,LC_PRJRECORD,PRJ_XTUSER,LC_MOD_PRJRECord_bak ");
Sb.Append(" where LC_PRJRECORD.USERID=PRJ_XTUSER.USERID AND LC_PRJGZ.GZID=LC_PRJRECORD.GZID And lc_prjrecord.gccode=lc_mod_prjrecord_bak.gccode ");
Sb.Append(" And lc_prjrecord.gzid=lc_mod_prjrecord_bak.gzid");
Sb.Append(" and LC_PRJRECORD.gccode=");
Sb.Append(StrGccode);
Sb.Append(" order by LC_MOD_PRJRECORD_BAK.E_TIME ");
string StrSql=Sb.ToString();
DataSet Ds=new DataSet();
OleDbConnection Cn=new OleDbConnection(DataConnectionString);
OleDbDataAdapter Da=new OleDbDataAdapter(StrSql,Cn);
Da.Fill(Ds,"GZ");
LC_GZ.DataSource=Ds;
LC_GZ.DataMember="GZ";
LC_GZ.DataBind();
}
public void DBItemEdit(Object sender,DataGridCommandEventArgs e){
LC_GZ.EditItemIndex = e.Item.ItemIndex;
BindData();
}
public void DBItemCancel(Object sender,DataGridCommandEventArgs e){
LC_GZ.EditItemIndex = - 1;
BindData();
}
public void DBItemUpdate(Object sender,DataGridCommandEventArgs e){
string StrGZID=e.Item.Cells[0].Text;
TextBox NTime=(TextBox)(e.Item.Cells[3].Controls[0]);
Response.Write(NTime.Text);
OleDbConnection Cn=new OleDbConnection(DataConnectionString);
OleDbCommand Cmd=new OleDbCommand();
Cmd.Connection=Cn;
Cmd.Connection.Open();
Cmd.CommandType=CommandType.StoredProcedure;
Cmd.CommandText="LC_MOD_Single"; //(@P_GCCODE,@P_GZID,@P_NEW_TIME,@P_Op_Name)";
Cmd.Parameters.Add("@P_GCCODE",StrGccode);
Cmd.Parameters.Add("@P_GZID",StrGZID);
Cmd.Parameters.Add("@P_NEW_TIME",NTime.Text);
Cmd.Parameters.Add("@P_Op_Name","");
Cmd.ExecuteNonQuery();
LC_GZ.EditItemIndex=-1;
BindData();
Cn.Close();
}
</Script>
<html>
<head>
</head>
<body>
<form runat="server">
<table>
<asp:DataGrid ID="LC_GZ" Runat="server" AllowPaging=False CellSpacing=0 CellPadding=5 AutoGenerateColumns=false Font-Size=13px
OnEditCommand="DBItemEdit" OnCancelCommand="DBItemCancel" OnUpdateCommand="DBItemUpdate">
<EditItemStyle BackColor="#FFFFEE">
</EditItemStyle>
<columns>
<asp:BoundColumn HeaderText="GZID" DataField="GZID" visible=false ReadOnly />
<asp:BoundColumn HeaderText="工作" DataField="GZName" ReadOnly/>
<asp:BoundColumn HeaderText="操作" DataField="DispName" ReadOnly />
<asp:BoundColumn HeaderText="时间" DataField="E_Time" />
<asp:TemplateColumn>
<ItemTemplate><img src='../images/fx2.gif' height=25></ItemTemplate>
</asp:TemplateColumn>
<asp:EditCommandColumn EditText="单项修改" CancelText="取消" UpdateText="保存" ItemStyle-Wrap="false" HeaderText="单项修改" HeaderStyle-Wrap="false"/>
</Columns>
</asp:DataGrid>
</form>
</body>
</html>
Top
7 楼ynduanlian(进一步海阔天高,退一步粉身碎骨)回复于 2005-02-01 15:21:46 得分 0
TextBox NTime=(TextBox)(e.Item.Cells[3].Controls[0]);
Response.Write(NTime.Text);
======================================
按理说这里取得的应当是我输入的新值,但实际却总是原来的值,怎么办?Top
8 楼LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^)回复于 2005-02-01 15:24:54 得分 6
public void Page_Load(Object sender,EventArgs e){
if(!Page.IsPostback)
{
StrGccode=Request.QueryString["GCCODE"];
BindData();
}
}Top
9 楼AllenTing(今天你GC了吗???)回复于 2005-02-01 15:45:06 得分 0
public void Page_Load(Object sender,EventArgs e){
StrGccode=Request.QueryString["GCCODE"];
BindData();
}
当然要进行IsPostBack的判断的Top




