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.
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
Je ne comprends pas comment résoudre ce problème. Veuillez m'aider à traverser ça. Votre aide sera vraiment appréciée.
3 Réponses :
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; }
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
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>
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
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; }
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.
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é primaireId
et charger tous les détails de l'employé correspondant.