我正在尝试使用下面的代码禁用特定的grdview行,但它没有禁用该行。我100%确定在绑定到gridview的列中有一个名为“Total Expenses”的值。更奇怪的是,我删除了if条件(accountTextBox.Text ==“Total Expenses”)以查看是否所有行都被禁用但只有第一行被禁用。有什么想法吗?
更多信息:我使用gridview和模板字段(ASP.NET,C#)。我还运行了调试器,发现 accountTextBox 显示为NULL。我很困惑!
我感谢您的任何想法。谢谢
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
if (!tableCopied)
{
originalDataTable = ((System.Data.DataRowView)e.Row.DataItem).Row.Table.Copy();
ViewState["originalValuesDataTable"] = originalDataTable;
tableCopied = true;
TextBox accountTextBox = (TextBox)e.Row.FindControl("AccountTextBox");
if (accountTextBox.Text == "Total Expenses")
{
e.Row.Enabled = false;
}
}
}
答案 0 :(得分:1)
我假设您的标记看起来像这样:
<asp:TemplateField HeaderText="SomeField" SortExpression="SomeField">
<EditItemTemplate>
<asp:TextBox ID="AccountTextBox" runat="server" Text='<%# Bind("SomeField") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("SomeField") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
在这种情况下,当e.Row.State处于编辑模式时,AccountTextBox
仅在RowDataBound中可用。根据您的数据源中提供的更新功能,可能会或可能不会提供...但这是其他内容。
通常,您不使用TextBox来显示数据,但是让我们尝试填充“只读”TextBox,然后您需要做的就是将AccountTextBox从EditTemplate移动到ItemTemplate,您应该很高兴。
答案 1 :(得分:0)
tableCopied
变量可能是问题所在。它将在第一行设置为true,这将限制剩余的行进入if条件并实际被禁用。
First row:
//tableCopied is false
if(!tableCopied) // pass
tableCopied = true
Other rows:
//tableCopied is true
if(!tableCopied) // wont pass
请注意,对于同一回发中的每一行,GridView1_RowDataBound
事件都会发生一次,并且在回发期间会保留每个类成员。
答案 2 :(得分:0)
使用以下代码隐藏:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
gvTest.DataSource = new List<string>() { "test1", "test2" };
gvTest.DataBind();
}
private bool tableCopied = false;
private System.Data.DataTable originalDataTable;
protected void gvTest_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
if (!tableCopied)
{
//originalDataTable = ((System.Data.DataRowView)e.Row.DataItem).Row.Table.Copy();
//ViewState["originalValuesDataTable"] = originalDataTable;
//tableCopied = true;
TextBox accountTextBox = (TextBox)e.Row.FindControl("AccountTextBox");
if (accountTextBox.Text == "Total Expenses")
{
e.Row.Enabled = false;
}
}
}
}
这个标记:
<asp:GridView runat="server" ID="gvTest" OnRowDataBound="gvTest_RowDataBound">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:TextBox ID="AccountTextBox" runat="server">Total Expenses</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
我没有复制这个bug。这两行都禁用了。