GridView行不会禁用

时间:2013-06-04 21:23:46

标签: c# asp.net webforms

我正在尝试使用下面的代码禁用特定的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;
                }

        }
}

3 个答案:

答案 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。这两行都禁用了。