я пытаюсь получить данные из базы данных и отобразить в gridview. для создания заголовка я использую тег HeaderTemlet. но в gridview всегда первый столбец идентификатора сотрудника пуст.
мой код такой же, как и на странице aspx:
<head runat = "server">
<title></title>
</head>
<body>
<form id = "form1" runat = "server">
<div>
<asp:GridView ID = "GridView1" runat = "server" Width = "99%" GridLines = "Both" OnRowDataBound = "GridView1_RowDataBound" AutoGenerateColumns = "false">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<tr>
<th style = "padding: 2.5px; width: 10%;" >eid</th>
<th style = "padding: 2.5px; width: 55%;" >First Name</th>
<th style = "padding: 2.5px;" >Last Name</th>
</HeaderTemplate>
</asp:TemplateField>
<asp:BoundField DataField = "idemp" />
<asp:BoundField DataField = "fname" />
<asp:BoundField DataField = "lname" />
<asp:TemplateField>
<ItemTemplate>
<asp:GridView ID = "GridView2" runat = "server" Width = "99%" GridLines = "Both" AutoGenerateColumns = "false" CssClass = "ChildGrid">
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</form>
код позади:
namespace WebApplication2
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// Populate the GridView.
bindGridview();
}
}
public void bindGridview()
{
DataTable dt = new DataTable();
string constr = @"server=127.0.0.1;user id=root;pwd=n0711p2010p;database=emp";
using (MySqlConnection con = new MySqlConnection(constr))
{
MySqlCommand cmd = new MySqlCommand("select idemp,fname,lname from emp", con);
con.Open();
MySqlDataReader dtreader = cmd.ExecuteReader();
dt.Load(dtreader);
if (dt.Rows.Count >0)
{
GridView1.DataSource = dt;
GridView1.DataBind();
con.Close();
}
}
}
//RowDataBound Event
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//Checking the RowType of the Row
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataTable dt = new DataTable();
string constr = @"server=127.0.0.1;user id=root;pwd=n0711p2010p;database=emp";
using (MySqlConnection con = new MySqlConnection(constr))
{
con.Open();
GridView child_gridview = (GridView)e.Row.FindControl("GridView2");
String CountryId = (e.Row.RowIndex+1).ToString();
MySqlCommand cmd = new MySqlCommand("select salary,post from emp where idemp = "+CountryId, con);
MySqlDataReader dtreader = cmd.ExecuteReader();
dt.Load(dtreader);
if (dt.Rows.Count > 0)
{
child_gridview.DataSource = dt;
child_gridview.DataBind();
}
}
}
}
}
}
первый столбец gridview всегда пуст. при использовании тега HeaderTemlet.
и я хочу добиться такого.
Похоже, вы отлично извлекаете данные, но не отображаете их должным образом.
Вы ошибочно используете TemplateField
для определения заголовков.
Вы можете просто сделать следующее:
<asp:GridView ID = "GridView1" runat = "server" Width = "99%" GridLines = "Both" OnRowDataBound = "GridView1_RowDataBound" AutoGenerateColumns = "false">
<Columns>
<asp:BoundField DataField = "idemp" headertext = "Employee ID" />
<asp:BoundField DataField = "fname" headertext = "First Name" />
<asp:BoundField DataField = "lname" headertext = "Last Name" />
</Columns>
</asp:GridView>
Как видите, имена заголовков определены прямо в связанном столбце.
Наслаждайтесь и дайте мне знать, если у вас все еще есть проблема
мне нужен подзаголовок, поэтому я использую <TemplaetField> и внутри этого тега <HeaderTemplate>. невозможно создать подзаголовок с предложенным вами решением. @daniDev
Если это так, вы можете перефразировать свой вопрос, чтобы ваши требования были ясны. Не могли бы вы уточнить, что вы ищете в подзаголовке? Шаблонное поле позволит вам создать заголовок только для одного столбца.
Если вы хотите, чтобы вложенный GridView охватывал несколько столбцов, вы должны сделать это в RowDataBound родительского GridView. Там вы можете установить colspan и удалить последние 2 ячейки.
Итак, если у вас есть GridView
<asp:GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "false" OnRowDataBound = "GridView1_RowDataBound">
<Columns>
<asp:TemplateField HeaderText = "Id">
<ItemTemplate>
<%# Eval("Id") %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText = "Name">
<ItemTemplate>
<%# Eval("Name") %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText = "Saldy">
<ItemTemplate>
<asp:GridView ID = "NestedGrid" runat = "server" AutoGenerateColumns = "true">
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText = "Address">
</asp:TemplateField>
<asp:TemplateField HeaderText = "City">
</asp:TemplateField>
</Columns>
</asp:GridView>
И событие RowDataBound
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//check if the row is a normal datarow
if (e.Row.RowType == DataControlRowType.DataRow)
{
//cast the row back to a datarowview
DataRowView row = e.Row.DataItem as DataRowView;
//use findcontrol to locate the nested gridview
GridView gv = e.Row.FindControl("NestedGrid") as GridView;
//bind data to the nested grid
gv.DataSource = source;
gv.DataBind();
//set the column span to 3 on the cell that has the nested gridview
e.Row.Cells[2].ColumnSpan = 3;
//hide the last 2 cells
e.Row.Cells[3].Visible = false;
e.Row.Cells[4].Visible = false;
}
}
Единственная проблема заключается в том, что ячейки родительского и дочернего элементов не совпадают по ширине, поэтому вам может потребоваться установить фиксированную ширину для этих столбцов.
Но проблема во внутренней ширине столбцов gridview. как сделать ширину равной ширине заголовка?
Я поместил скриншот результата в конце моего вопроса после применения вашей логики.
Установите ширину ячеек напрямую с помощью HeaderStyle-Width
(<asp:TemplateField HeaderText = "Saldy" HeaderStyle-Width = "100">
) или с помощью класса CSS, чтобы убедиться, что они имеют одинаковую ширину. Или попробуйте не использовать вложенные GridViews.
Любопытно узнать, было ли мое решение полезным для вас?