使用autogeneratecolumns = true重命名gridview中的列标题文本

时间:2013-11-14 17:31:45

标签: c# asp.net gridview dynamic autogeneratecolumn

我有一个gridview,在用户按下一个带有查询后面的代码的按钮后显示来自1个表的查询数据,这个gridview有autogeneratecolumns = false,我自己添加了BoundField DataField头文本,例如,第一列中的db的名称为“prd_nome”,我将其更改为“nome”,一切都按原样运行。

现在我在数据库中创建了另一个表,具有不同的名称和不同的列名称,我还添加了另一个带有代码隐藏查询的按钮,以从该表中获取数据但是为了显示数据现在autogeneratecolumns = true,我测试了按钮并且它工作正常,但是标题文本与列名相同,并且ID列也显示在两个查询中。

如何将标题文本硬编码到我想要的内容以及如何隐藏ID列?通过标签?通过boundfield数据域?通过AS sql运营商? 如果有人能帮助我,我会很感激,因为我是一名新手

这是当前的gridview asp代码:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"></asp:GridView>

这是从第一个表传递查询的按钮的代码:

protected void Button1_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable();

    SqlConnection connection = new SqlConnection(GetConnectionString());
    connection.Open();
    SqlCommand sqlCmd = new SqlCommand("SELECT * FROM [ERPDQ].[dbo].[prd] WHERE prd_desc LIKE ('torta%')", connection);
    SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);

          sqlDa.Fill(dt);
    if (dt.Rows.Count > 0)
    {
        GridView1.DataSource = dt;
        GridView1.DataBind();

    }
    connection.Close();
}

这是来自按钮的代码,它传递关于第二个表的查询:

protected void Button6_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable();

    SqlConnection connection = new SqlConnection(GetConnectionString());
    connection.Open();
    SqlCommand sqlCmd = new SqlCommand("SELECT * FROM [ERPDQ].[dbo].[outra]", connection);
    SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);

    sqlDa.Fill(dt);
    if (dt.Rows.Count > 0)
    {
        GridView1.DataSource = dt;
        GridView1.DataBind();

    }
    connection.Close();
}

}

4 个答案:

答案 0 :(得分:3)

你没有提到有一个GridView或者有两个GridView。

如果页面上有两个GridView,那么只需为两个GridView添加onrowdatabound事件。

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"  onrowdatabound="GridView1_RowDataBound"></asp:GridView>

<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="true" onrowdatabound="GridView2_RowDataBound"></asp:GridView>

如果只有一个GridView,那么在页面加载之前定义两个布尔变量(btn1Click,btn2Click)。在按钮1上单击事件设置btn1单击以ture并将btn2Click设置为false,在button2上单击事件设置btn2Click为true并且btn1Click为false并在OnRowDataBound事件根据btn click设置列名。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
  //supposing id is the first cell,change the index according to your grid
  // hides the first column
  e.Row.Cells[0].Visible = false; 

  if(btn1Click)
  {
     //to set header text
     if (e.Row.RowType == DataControlRowType.Header)
     {
        e.Row.Cells[1].Text = "Cell Text";
        e.Row.Cells[2].Text = "Cell Text";
     }
  }
  else if(btn2Click)
  {
     //to set header text
     if (e.Row.RowType == DataControlRowType.Header)
     {
        e.Row.Cells[1].Text = "Cell Text";
        e.Row.Cells[2].Text = "Cell Text";
      }
  }
}

如果适合您,请将两个答案都标记为正确。

答案 1 :(得分:0)

您可以在GridView RowDataBound事件

上执行此操作
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
  //supposing id is the first cell,change the index according to your grid
  // hides the first column
  e.Row.Cells[0].Visible = false; 

  //to set header text
  if (e.Row.RowType == DataControlRowType.Header)
  {
     e.Row.Cells[1].Text = "Cell Text";
     e.Row.Cells[2].Text = "Cell Text";
  }
}

答案 2 :(得分:0)

使用AutoGenerateColumns = True时,您可以在select语句中使用AS sql运算符更改列的标题文本(如您所建议的那样)。

虽然一般避免使用AutoGenerateColumns = True,因为它不灵活。正如你所指出的那样,你会被诸如隐藏一列之类的简单事物所困扰。

以下是使用RowDataBound事件

隐藏ID列的示例
protected void rowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        for (int i = 0; i < e.Row.Controls.Count; i++)
        {
            var headerCell = e.Row.Controls[i] as DataControlFieldHeaderCell;
            if (headerCell != null)
            {
                if (headerCell.Text == "name_of_id_column")
                {
                    headerCell.Visible = false;
                    Page.Items["IDCellIndex"] = i;
                    break;
                }
            }
        }   
    }
    else if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Footer)
    {
        int idCellIndex = Convert.ToInt32(Page.Items["IDCellIndex"]);

        e.Row.Controls[idCellIndex].Visible = false;
    }
}

答案 3 :(得分:0)

感谢大家,我确信在实施后我会根据项目的方向使用一些答案。

关于我的gridview列标题重命名问题,我发现AS运算符可以满足当前的需求,我再次感谢所提供的所有帮助