1
votes

Comment obtenir la valeur de la cellule dans un GridView sur un événement de clic LinkButton? Ou RowCommand?

J'ai un GridView qui contient plusieurs enregistrements et quelques boutons de lien nommés Edit et Detail. Maintenant, je veux obtenir le nom de l'utilisateur (PAS d'index), lorsqu'un utilisateur clique sur le bouton de lien de détail. Comme "Name", "FatherName", etc. Voici le code .aspx

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

Voici le code lbDetail_Click

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

Quand je mets mon programme en mode débogage, le lblUserName renvoie NULL Voici la photo. entrez la description de l'image ici

Ce que je veux, c'est que, lorsqu'un utilisateur clique sur Détail LinkButton, puis sur l'événement lbDetail Click, il obtient le nom de l'employé et le stocke dans une variable statique. Voici l'image entrez la description de l'image ici

Je ne comprends pas comment résoudre ce problème. Veuillez m'aider à traverser ça. Votre aide sera vraiment appréciée.


2 commentaires

Pouvez-vous s'il vous plaît supprimer ce NavigateUrl du LinkButton. Ce que je pense, c'est que le contrôle de page / grille est déchargé avant qu'il n'atteigne l'événement.


En fait, j'ai besoin de l'attribut NavigateUrl . La raison en est que je veux accéder à une autre page sur la base de la clé primaire Id et charger tous les détails de l'employé correspondant.


3 Réponses :


1
votes

lblUserName est nul car ce n'est pas un Label, mais un BoundField. Ce que vous pouvez faire, obtenez la valeur de la cellule.

<asp:TemplateField HeaderText="Name">
    <ItemTemplate>
        <asp:Label ID="Name" runat="server" Text='<%# Eval("Name")%>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

Ou utilisez un TemplateField qui contient un Label Name

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


4 commentaires

Si vous avez fait en sorte que Label contrôle un lien avec un ID , je vous recommanderai d'utiliser la méthode FindControl () car cela me semble clair plutôt que de suivre l'index de la colonne.


Merci, il obtient le Nom et le stocke, mais il ne navigue pas vers une autre page avec toutes les informations. par la méthode Response.Redirect , je peux accéder à la page EmployeeDetails.aspx mais la QueryString renvoie NULL . Veuillez aider à résoudre le problème.


Qu'entendez-vous par ne pas accéder à une autre page ? Et il en va de même pour QueryString vide? Peut-être voulez-vous mettre la valeur dans une Session et faire une Response.Redirect ?


Ce que je veux dire, c'est que lorsqu'un Utilisateur clique sur Détails LinkButton, alors il dirige l'utilisateur vers UserDetail.aspx avec la clé primaire Id . puis sur la page UserDetails Load Event , je récupère les données de la Database et remplis le contrôle DataList sur la base de cet Id qui provient du contrôle Gridview . J'espère que tu as eu ma question



1
votes

Je voudrais simplement ajouter des attributs de données au bouton de détails, puis obtenir ses valeurs au code derrière.

Par exemple:

1.) Add new data-myData = ' 'et sa valeur au bouton

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

2.) Récupérez ces données du gestionnaire d'événements

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

p>


3 commentaires

Merci, oui, je comprends cela, mais je veux aussi naviguer vers une autre page avec toutes les informations de l'employé sur la base de la clé primaire. Comme vous me dites de le faire, il obtient le nom et le stocke dans la variable statique, mais ne naviguez pas jusqu'à la page que je veux naviguer. Il dépasse l'attribut NavigateUrl. Veuillez me dire comment faire cela sur LinkButton Click Event. Merci pour les informations btw!


Que diriez-vous de définir une variable de session dans l'événement de clic ou vous pouvez ajouter l'ID dans la chaîne de requête:


Merci mon pote. J? ai compris. C'est pourquoi j'accepte votre réponse. #Paix



0
votes

Voici à quoi devrait ressembler votre code:

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


2 commentaires

Ouais, je le sais, mais ce que je veux, c'est obtenir le nom quoi qu'il arrive, je ne veux pas de valeur nulle. Je veux un nom et le stocker dans une variable statique que je vais utiliser dans la page de contenu Détails.


Le morceau de code ci-dessus vous donne un nom. vous pouvez en faire tout ce que vous voulez.