我需要在GridView中编辑期间更改值。我正在使用代码隐藏中的方法Decrypt(object)
。它适用于Eval()
,但不适用Bind()
。
<asp:GridView ID="GridView1" runat="server"
DataKeyNames="ID" DataSourceID="entityDataSource1" >
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="lblTab1" runat="server"
Text='<%# Decrypt(Eval("Name")) %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="lblTab1" runat="server"
Text='<%# Decrypt(Bind("Name")) %>' />
</EditItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
答案 0 :(得分:1)
当我需要这样做时,我通常会在TextBox
事件后面的代码上设置Text
RowDataBound
属性。就像这样:
protected void GridView1_RowDataBound( Object sender, System.Web.UI.WebControls.GridViewRowEventArgs e ) {
if( e.Row.RowType == DataControlRowType.DataRow && e.Row.RowState == DataControlRowState.Edit ) {
TextBox txt = ( TextBox )e.Row.FindControl( "lblTab1" );
if( txt != null ) {
DataRowView drv = ( DataRowView )e.Row.DataItem;
txt.Text = Decrypt( drv["Name"].ToString() );
}
}
}
对于这项工作,您的GridView
EditIndex
属性必须设置为您正在编辑的实际索引。
答案 1 :(得分:0)
Eval()
和Bind()
是截然不同的生物 - Eval()
只是DataBinder.Eval()
的简写,Bind()
由ASP.NET
解析器解释,分为两部分 - 一部分用于将数据绑定到控件,另一部分用于将数据从控件移动到模型。
在这篇老博文中很好地描述了这一点:How ASP.NET databinding deals with Eval and Bind statements
你没有提到你的约束力;如果绑定到业务对象,则可以为未加密的Name创建getter / setter属性。或者,您可以提供OnRowUpdating
的实施,并在那里执行Decrypt
。 (提示:使用解密的值更新NewValues[]
成员。)