Неправильно установлены данные в GridView

я пытаюсь получить данные из базы данных и отобразить в 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

первый столбец gridview всегда пуст. при использовании тега HeaderTemlet. и я хочу добиться такого.Неправильно установлены данные в GridView

Неправильно установлены данные в GridView

Любопытно узнать, было ли мое решение полезным для вас?

DaniDev 31.05.2019 08:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, вы отлично извлекаете данные, но не отображаете их должным образом.

Вы ошибочно используете 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

nisarg parekh 31.05.2019 09:26

Если это так, вы можете перефразировать свой вопрос, чтобы ваши требования были ясны. Не могли бы вы уточнить, что вы ищете в подзаголовке? Шаблонное поле позволит вам создать заголовок только для одного столбца.

DaniDev 31.05.2019 21:48
Ответ принят как подходящий

Если вы хотите, чтобы вложенный 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. как сделать ширину равной ширине заголовка?

nisarg parekh 05.06.2019 11:22

Я поместил скриншот результата в конце моего вопроса после применения вашей логики.

nisarg parekh 05.06.2019 11:23

Установите ширину ячеек напрямую с помощью HeaderStyle-Width (<asp:TemplateField HeaderText = "Saldy" HeaderStyle-Width = "100">) или с помощью класса CSS, чтобы убедиться, что они имеют одинаковую ширину. Или попробуйте не использовать вложенные GridViews.

VDWWD 05.06.2019 11:52

Другие вопросы по теме