【问题标题】:GridView row won't disableGridView 行不会禁用
【发布时间】:2013-06-05 06:40:09
【问题描述】:

我正在尝试使用下面的代码禁用特定的 grdview 行,但它并没有禁用该行。我100%确定绑定到gridview的列中有一个名为“Total Expenses”的值。更奇怪的是,我删除了 if 条件(accountTextBox.Text == "Total Expenses") 以查看是否所有行都被禁用但只有第一行被禁用。对此有什么想法吗?

更多信息:我正在使用带有模板字段(ASP.NET、C#)的 gridview。我还运行了调试器,发现 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;
                }

        }
}

【问题讨论】:

  • tableCopied 设置在哪里?该值可能不会通过 PostBacks 持续存在。
  • 感谢 Garrison,下面几行就在我之前发布的代码块的正上方:public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } private bool tableCopied = false; private System.Data.DataTable originalDataTable;
  • 你能发布模板标记吗
  • 也 - 变量不会持续存在,除非保存/恢复到/从视图状态或会话状态
  • 他不需要持久化它们,因为他在代码隐藏中手动将 tableCopied 设置为 false。

标签: c# asp.net webforms


【解决方案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>

在这种情况下,AccountTextBox 将仅在 e.Row.State 处于编辑模式时在 RowDataBound 中可用。根据您的数据源中提供的更新功能,它可能可用也可能不可用……但这是另一回事。

通常您不使用 TextBox 来显示数据,但假设您尝试填充“只读”TextBox,那么您所需要做的就是将 AccountTextBox 从 EditTemplate 移动到 ItemTemplate,然后您就可以开始了。

【讨论】:

  • 这是一个有效的点,但如果是这样,他检查accountTextBox.Text 值的代码会抛出空引用异常。
  • 是的。虽然他没有明确说出来,但他确实声明了accountTextBox 的值为空……结论?
  • 让你兴奋——完全忘记了他提到的 null。
  • :) 你是个好人。顺便说一句可爱的猫。很高兴和你聊天。
【解决方案2】:

使用以下代码隐藏:

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>

我没有重现错误。这两行都对我禁用。

【讨论】:

  • 需要检查的东西 - 如果他真的在模板标记 ItemTemplate 中放置了一个文本框 - 这是一回事。如果他将绑定字段转换为模板,我相信它会在 ItemTemplate 中放置一个标签,在 EditTemplate 中放置一个文本框。我可能是错的,但我认为除非 Gridview 处于编辑模式,否则您不会找到文本框,这就是我想查看他的标记的原因。
  • 非常感谢大家,所有的建议都奏效了。很高兴成为这个社区的一员。希望我会尽快开始还款:) 我无法将您的帖子标记为答案,版主,您能帮忙吗?
  • 没关系 - 当你发表评论时,我正在发表我的想法 - 很高兴我们都为你指明了正确的方向。
【解决方案3】:

tableCopied 变量可能是问题所在。它将在第一行设置为 true,这将限制其余行进入 if 条件并实际禁用。

First row:   
  //tableCopied is false
  if(!tableCopied) // pass
      tableCopied = true

Other rows:
  //tableCopied is true
  if(!tableCopied) // wont pass

请注意,GridView1_RowDataBound 事件在同一回发中的每一行都会发生一次,并且每个类成员都会在回发期间持久化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 2014-09-14
    • 2014-04-17
    相关资源
    最近更新 更多