我有一个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();
}
}
答案 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
事件
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运算符可以满足当前的需求,我再次感谢所提供的所有帮助