【问题标题】:How to change the Header Text of Gridview after Databound?Databound后如何更改Gridview的标题文本?
【发布时间】:2010-09-21 06:58:22
【问题描述】:

我有一个网格视图,我用该网格视图绑定了一个 DataTable,它是动态的,所以在设计中没有硬编码文本。

我尝试在 Databound 之后和在 gridview 的 PreRender 中更改它,但没有成功。

其实文本中有下划线('_'),我想用空格代替。

下面是代码

<asp:GridView ID="grdSearchResult" runat="server" AutoGenerateColumns="True" Width="99%" OnPreRender="grdSearchResult_PreRender"
            OnRowCreated="grdSearchResult_OnRowCreated" OnPageIndexChanging="grdSearchResult_PageIndexChanging">
            <HeaderStyle ForeColor="White" BackColor="#215B8D" />
            <AlternatingRowStyle BackColor="#F7F7F7" />
            <RowStyle CssClass="gridtext" HorizontalAlign="Center" />
        </asp:GridView>



protected void grdSearchResult_PreRender(object sender, EventArgs e)
{
    for (int i = 0; i < grdSearchResult.Columns.Count; i++)
    {
        grdSearchResult.Columns[i].HeaderText = grdSearchResult.Columns[i].HeaderText.Replace("_", "");
    }
}

【问题讨论】:

    标签: .net asp.net gridview asp.net-3.5


    【解决方案1】:

    可以使用GridViewRowDataBound 事件来做到这一点

    protected void grdSearchResult_RowDataBound(object sender, GridViewRowEventArgs e)
    {
         if (e.Row.RowType == DataControlRowType.Header)
         {
            for (int i = 0; i < e.Row.Cells.Count; i++)
            {
                e.Row.Cells[i].Text = e.Row.Cells[i].Text.Replace("_", " ");
            }
         }
    }
    

    而且效果很好。

    【讨论】:

    • 这行得通,它只会在每次绑定一行时完成。
    【解决方案2】:

    您可以更改单元格的文本,而不是 HeaderText 属性:

            for (int i = 0; i < grdSearchResult.Columns.Count; i++)
            {
                grdSearchResult.HeaderRow.Cells[i].Text = grdSearchResult.HeaderRow.Cells[i].Text.Replace("_", "");
            }
    

    您无需在 PreRender 中执行此操作,只需在数据绑定后即可。

    【讨论】:

    • 使用 grdSearchResult.HeaderRow.Cells.Count 而不是 grdSearchResult.Columns.Count 让它工作
    • 这个符合我的目的。在 page_load 事件中的 gridview.DataBind() 之后立即调用。
    【解决方案3】:

    将gridview的AutoGenerateColumns属性设置为false并添加BoundFields。

    <asp:GridView ID="grdEmployee" runat="server" AutoGenerateColumns="false">
    <columns>
    <asp:BoundField HeaderText="ID" DataField="empNo" />
    <asp:BoundField HeaderText="First Name" DataField="fName" />
    <asp:BoundField HeaderText="Last Name" DataField="lName" />
    </columns>
    </asp:GridView>
    

    【讨论】:

      【解决方案4】:

      但在 OnRowDataBound 事件中,原始 e.Row.Cell[i].Text 不可用于更改。

      例如。在“headerRow”下面的代码中始终为空。

      protected void grdSearchResult_RowDataBound(object sender, GridViewRowEventArgs e)
      {
           if (e.Row.RowType == DataControlRowType.Header)
           {
              for (int i = 0; i < e.Row.Cells.Count; i++)
              {
                  string headerRow = e.Row.Cells[i].Text;
                  e.Row.Cells[i].Text = headerRow.Replace("_", " ");
              }
           }
      }
      

      【讨论】:

      • 这应该是评论,而不是答案。
      • 是的,我遇到了这个问题...HeaderRow 属性在Page_Load 事件期间尝试使用它时为空。在此处搜索以查看我应该何时、何地以及如何访问标题。
      【解决方案5】:

      如果您的标题比其他示例(例如排序按钮)更复杂,请使用:

      protected void gvMain_RowDataBound(object sender, GridViewRowEventArgs e)
          {
              GridViewRow oRow = e.Row;
              if (oRow.RowType == DataControlRowType.Header)
              {
                  foreach (TableCell oCell in oRow.Cells)
                  {
                      foreach (var oCtl in oCell.Controls) {
                          if(oCtl.GetType() == typeof(System.Web.UI.WebControls.Label))
                          {
                              Label oLBL = (Label)oCtl;
      
                              oLBL.Text = oLBL.Text.Replace("_", "");
                          }
                      }
                  }
                  
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多