Ich habe eine GridView, die mehrere Datensätze und einige Link-Schaltflächen mit den Namen Bearbeiten und Detail enthält. Jetzt möchte ich den Namen des Benutzers (NICHT Index) erhalten, wenn ein Benutzer auf Detail Link Button klickt. Wie "Name", "FatherName" usw. Hier ist der ASPX-Code

<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>

Hier ist der lbDetail_Click-Code

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();
}

Wenn ich mein Programm in den Debugging-Modus versetze, gibt der lblUserName NULL zurück Hier ist das Bild. Bildbeschreibung hier eingeben

Wenn ein Benutzer auf Detail LinkButton und dann auf lbDetail Click klickt, erhält er den Namen des Mitarbeiters und speichert ihn in einer statischen Variablen. Es folgt das Bild Bildbeschreibung hier eingeben

Ich verstehe nicht, wie ich dieses Problem lösen soll. Bitte helfen Sie mir dabei. Ihre Hilfe wird sehr geschätzt.

1
Af'faq 17 Jän. 2019 im 20:51

3 Antworten

Beste Antwort

Ich würde einfach Datenattribute zur Detailschaltfläche hinzufügen und dann die Werte im Code dahinter abrufen.

Beispielsweise:

1.) Fügen Sie das neue Attribut data-myData = '<% # Eval ("Name")%>' und dessen Wert zur Schaltfläche hinzu

                    <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.) Holen Sie sich diese Daten vom Event-Handler

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 ;
}
1
Anh-Tuan N. 18 Jän. 2019 im 17:48

lblUserName ist null, da es sich nicht um ein Label, sondern um ein BoundField handelt. Was Sie tun könnten, um den Cell-Wert zu erhalten.

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

Oder verwenden Sie ein TemplateField, das eine Bezeichnung Name enthält.

<asp:TemplateField HeaderText="Name">
    <ItemTemplate>
        <asp:Label ID="Name" runat="server" Text='<%# Eval("Name")%>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>
1
VDWWD 17 Jän. 2019 im 18:27

So sollte Ihr Code aussehen:

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
Jamshaid Kamran 17 Jän. 2019 im 18:38