【问题标题】:GridView header text not showing when binded dynamically for first time第一次动态绑定时不显示 GridView 标题文本
【发布时间】:2014-02-10 11:47:30
【问题描述】:

我有一个 GridView,它是在单击按钮时使用 linq 查询填充的。

我必须从数据库中获取动态填充标题文本。我第一次单击按钮时,标题文本没有绑定。但是,如果我再次单击该按钮,则会绑定标题文本。

标记:

   <asp:GridView ID="grdresult" runat="server" AutoGenerateColumns="false" 
            OnRowDataBound="grdresult_RowDataBound">                   
            <Columns>                        
                <asp:TemplateField HeaderStyle-Width="10%">
                    <ItemTemplate>
                       <asp:Label ID="lblCol1" runat="server" Text=' <%#Eval("Col1") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderStyle-Width="10%">
                    <ItemTemplate>
                        <asp:Label ID="lblCol2" runat="server" Text='<%#Eval("Col2") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderStyle-Width="10%">
                    <ItemTemplate>
                        <asp:Label runat="server" Text='<%#Eval("Col3") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderStyle-Width="10%">
                    <ItemTemplate>
                       <asp:Label ID="lblCol4" runat="server" Text=' <%#Eval("Col4") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderStyle-Width="10%">
                    <ItemTemplate>
                        <asp:Label ID="lblCol5" runat="server" Text='<%#Eval("Col5") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderStyle-Width="10%">
                    <ItemTemplate>
                       <asp:Label ID="lblCol6" runat="server" Text=' <%#Eval("Col6") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderStyle-Width="10%">
                    <ItemTemplate>
                       <asp:Label ID="lblCol7" runat="server" Text=' <%#Eval("Col7") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderStyle-Width="10%">
                    <ItemTemplate>
                       <asp:Label ID="lblCol8" runat="server" Text=' <%#Eval("Col8") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            <EmptyDataTemplate>
            No Records Found
           </EmptyDataTemplate>
        </asp:GridView>

代码隐藏:

protected void btnreport_Click(object sender, EventArgs e)
{       
    BindGrid();     
}

protected void BindGrid()
{  
    var results = "LINQ select query from database";
                       }).Distinct().ToList();

    for (int i = 0; i < grdresult.Columns.Count; i++)
    {
        grdresult.Columns[i].Visible = true;
    }

    grdresult.DataSource = results;
    grdresult.DataBind();       

}

protected void grdresult_RowDataBound(object sender, GridViewRowEventArgs e)
{

    if (e.Row.RowType == DataControlRowType.Header)
    {
        var getColumnHeader = "LINQ query to get header text";
        if (getColumnHeader != null)
        {
            grdresult.Columns[5].HeaderText = getColumnHeader.HCol3;
            grdresult.Columns[6].HeaderText = getColumnHeader.HCol4;
            grdresult.Columns[7].HeaderText = getColumnHeader.HCol5;
            grdresult.Columns[8].HeaderText = getColumnHeader.HCol6;
            grdresult.Columns[9].HeaderText = getColumnHeader.HCol7;
            grdresult.Columns[10].HeaderText = getColumnHeader.HCol8;
            grdresult.Columns[11].HeaderText = getColumnHeader.HCol9;
            grdresult.Columns[12].HeaderText = getColumnHeader.HCol10;                    
        }
    }

    //based on some condition i have set visibility of gridview columns
    int TotalColumnCount = (int)ViewState["colcount"];
    for (int i = grdresult.Columns.Count - 1; i > TotalColumnCount + 4; i--)
    {
        grdresult.Columns[i].Visible = false;
    }        
}

【问题讨论】:

  • 什么意思是“第一次”,你是否在!IsPostBack 上对网格进行数据绑定?你需要点击按钮两次吗?
  • 只有在按钮单击时我才绑定gridview。数据在第一次单击按钮时正确绑定到gridview,标题文本除外。再次单击按钮时会出现标题文本
  • 尝试将与标题行相关的代码放在 RowCreated 事件的处理程序中。
  • 如果像这样在 page_Load 上绑定 gridview 会发生什么 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Binfgrid(); } }
  • 嗯,我认为您为此使用了错误的事件。 RowDataBound 事件,触发器,每次数据网格将创建一个包含数据的行。我认为您需要的事件是 OnDataBound,它是在网格绑定所有内容后触发的。

标签: c# asp.net gridview


【解决方案1】:

而不是使用下面的行来绑定标题文本
grdresult.Columns[5].HeaderText = getColumnHeader.HCol3;

我使用下面的行解决了这个问题。

e.Row.Cells[5].Text = getColumnHeader.HCol3;

【讨论】:

    【解决方案2】:

    如果您将整数值转储到 varchar() 但 varchar 的大小不够,也会发生此错误。例如,当我将 sum() 转换为 varchar(10) 时,我遇到了这个错误,因此出现了错误。

    我将 varchar(10) 更改为 varchar(20),错误得到解决。

    【讨论】:

      【解决方案3】:

      在Gridview控件集中ClientIDMode = "Static"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-13
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多