Как получить значение ячейки в GridView при событии LinkButton Click? Или RowCommand? - PullRequest
0 голосов
/ 17 января 2019

У меня есть GridView, который содержит несколько записей и пару названных кнопок ссылки Редактировать и детализировать. Теперь я хочу получить имя пользователя (НЕ указатель), когда пользователь нажимает кнопку «Подробно». Как "имя", "имя отца" и т. Д Вот код .aspx

<asp:GridView ID="dgvEmployeesInformation" runat="server" CssClass=" table table-bordered table-hover table-responsive" DataKeyNames="Id" AutoGenerateColumns="False" OnRowCommand="dgvEmployeesInformation_RowCommand" OnRowDataBound="dgvEmployeesInformation_RowDataBound" AllowPaging="True" AllowSorting="True" OnPageIndexChanging="dgvEmployeesInformation_PageIndexChanging">
    <%--1st Column--%>
    <Columns>
        <asp:BoundField HeaderText="ID" DataField="Id" ControlStyle-BackColor="#0066ff" Visible="False">
            <ControlStyle BackColor="#0066FF"></ControlStyle>
        </asp:BoundField>
        <asp:BoundField HeaderText="Name" DataField="Name" />
        <asp:BoundField HeaderText="Employee No" DataField="EmployeeNo" />
        <asp:BoundField HeaderText="Father Name" DataField="FatherName" />
        <asp:HyperLinkField DataNavigateUrlFields="Id" DataNavigateUrlFormatString="AddEmployeeBasic1.aspx?thid={0}" HeaderText="Update" NavigateUrl="~/AddEmployeeBasic1.aspx" Text="Edit" />
        <asp:TemplateField HeaderText="Action" ShowHeader="True">
            <ItemTemplate>
                <asp:LinkButton ID="lbDelete" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton runat="server" ID="lbDetail" OnClick="lbDetail_Click" DataNavigateUrlFields="Id" DataNavigateUrlFormatString="EmployeesDetails.aspx?EmpID={0}" NavigateUrl="~/EmployeesDetails.aspx" HeaderText="Show Detail" Text="Detail"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Вот код lbDetail_Click

protected void lbDetail_Click(object sender, EventArgs e)
{
    GridViewRow clickedRow = ((LinkButton)sender).NamingContainer as GridViewRow;
    Label lblUserName = (Label)clickedRow.FindControl("Name");
    EmployeeID.EmpName = lblUserName.ToString();
}

Когда я помещаю свою программу в режим отладки, lblUserName возвращает NULL Вот картинка. enter image description here

Что я хочу, так это то, что, когда пользователь нажимает на Detail LinkButton, а затем на событие Click lbDetail, он получает имя сотрудника и сохраняет его в статической переменной. Ниже приводится картина enter image description here

Я не понимаю, как решить эту проблему. Пожалуйста, помогите мне через это. Ваша помощь будет очень признательна.

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Я бы просто добавил атрибуты данных к кнопке сведений, а затем получил бы их значения в коде позади.

Например:

1.) Добавьте новый атрибут data-myData = '<% # Eval ("Name")%>' и его значение для кнопки

                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:LinkButton runat="server" ID="lbDetail" OnClick="lbDetail_Click" Text="Detail" data-ID='<%# Eval("ID") %>' data-myData='<%# Eval("Name") %>' ></asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>

2.) Получить эти данные из обработчика событий

protected void lbDetail_Click(object sender, EventArgs e)
{
     LinkButton button = (LinkButton)sender;
     var name = (string)button.Attributes["data-myData"];
     var selectedID = (string)button.Attributes["data-ID"];
     Session["selectedID"] = selectedID ;
}
0 голосов
/ 17 января 2019

Вот как должен выглядеть ваш код:

protected void lbDetail_Click(object sender, EventArgs e)
{
    GridViewRow clickedRow = ((LinkButton)sender).NamingContainer as GridViewRow;
    var username = clickedRow.Cells[1].Text;
    if(string.IsNullOrEmpty(username))
    {
        return;
    }
    EmployeeID.EmpName = username;
}
0 голосов
/ 17 января 2019

lblUserName - ноль, потому что это не Label, а BoundField. Что вы могли бы сделать, это получить значение ячейки.

protected void lbDetail_Click(object sender, EventArgs e)
{
    GridViewRow clickedRow = ((LinkButton)sender).NamingContainer as GridViewRow;
    Label1.Text = clickedRow.Cells[1].Text;
}

Или используйте TemplateField, который содержит метку Name

<asp:TemplateField HeaderText="Name">
    <ItemTemplate>
        <asp:Label ID="Name" runat="server" Text='<%# Eval("Name")%>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...