web-dev-qa-db-fra.com

c # gridview row click

Lorsque je clique sur une ligne de mon GridView, je souhaite accéder à une autre page avec l'ID obtenu dans la base de données. 

Dans mon événement RowCreated, j'ai la ligne suivante:

e.Row.Attributes.Add(
     "onClick",
     ClientScript.GetPostBackClientHyperlink(
          this.grdSearchResults, "Select$" + e.Row.RowIndex));

Pour éviter les messages d'erreur, j'ai ce code:

protected override void Render(HtmlTextWriter writer)
{
    // .NET will refuse to accept "unknown" postbacks for security reasons. 
    // Because of this we have to register all possible callbacks
    // This must be done in Render, hence the override
    for (int i = 0; i < grdSearchResults.Rows.Count; i++)
    {
        Page.ClientScript.RegisterForEventValidation(
                new System.Web.UI.PostBackOptions(
                    grdSearchResults, "Select$" + i.ToString()));
    }
    // Do the standard rendering stuff
    base.Render(writer);
}

Comment puis-je attribuer un ID unique à une ligne (à partir de la base de données) et lorsque je clique sur cette ligne, une autre page est ouverte (comme en cliquant sur un href) et cette page peut lire l'identifiant.

19
Martijn

J'ai la solution.

Voici ce que j'ai fait:

if(e.Row.RowType == DataControlRowType.DataRow)
{
    e.Row.Attributes["onClick"] = "location.href='view.aspx?id=" + DataBinder.Eval(e.Row.DataItem, "id") + "'";
}

J'ai mis le code précédent dans l'événement RowDataBound.

19
Martijn

Martijn,

Voici un autre exemple avec quelques lignes intéressantes et un curseur de style href:

protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#ceedfc'");
    e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=''");
    e.Row.Attributes.Add("style", "cursor:pointer;");
    e.Row.Attributes.Add("onclick", "location='patron_detail.aspx?id=" + e.Row.Cells[0].Text + "'");
  }
}

Le code ci-dessus fonctionne dans .NET 3.5. Cependant, vous ne pouvez pas définir votre colonne id sur Visible = "false" car vous obtiendrez une valeur de chaîne de requête vide pour votre clé id:

<asp:GridView ID="gvSearch" runat="server" OnRowDataBound="gvSearch_RowDataBound" AutoGenerateColumns="false">
  <Columns>
    <asp:BoundField DataField="id" Visible="false" />
    <asp:BoundField DataField="first_name" HeaderText="First" />
    <asp:BoundField DataField="last_name" HeaderText="Last" />
    <asp:BoundField DataField="email" HeaderText="Email" />
    <asp:BoundField DataField="state_name" HeaderText="State" />
  </Columns>
</asp:GridView>

Ajoutez ce css en haut de votre page:

<head>
  <style type="text/css">
    .hide{
      display:none;
    }
  </style>
<head>

Mais pour masquer la première cellule de votre ligne d’en-tête, ajoutez ceci à votre gvSearch_RowDataBound () dans code-behind:

if (e.Row.RowType == DataControlRowType.Header)
{
  e.Row.Cells[0].CssClass = "hide";
}

Bien entendu, vous auriez peut-être aussi caché la colonne id dans code-behind, mais cela entraînera plus de texte dans votre balisage qu'une classe css:

e.Row.Cells[0].Attributes.Add("style", "display:none;");
e.Row.Attributes.Add("style", "cursor:pointer;");

19
JohnB
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();
        e.Row.Attributes["onClick"] = "location.href='Default.aspx?id=" + abc + "'";    
    }
}
3
Falak Shah
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
        string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString(); 
        e.Row.Attributes["onClick"] = "location.href='Default.aspx?id=" + abc + "'";     
    } 
} 
1
mohan
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)  
{     
 if (e.Row.RowType == DataControlRowType.DataRow)
        {
            GridViewRow gvr = e.Row;
            string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();         
            gvr.Attributes.Add("OnClick", "javascript:location.href='Default.aspx?id=" + abc + "'");
        }         

   }  
}  
1
Jyoti Nagda

Vous pouvez utiliser l'événement RowCommand de la vue de grille pour celui-ci. Dans votre bouton/lien où vous souhaitez définir le clic, définissez CommandName et CommandArgument, que vous pouvez accéder au paramètre EventArgs de la méthode event.

0
Bhaskar

ligne cliquez en mode grille rediriger vers une autre page 

    protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
             string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();
             e.Row.Attributes["onClick"] = "location.href='Default.aspx?id=" + abc + "'";
        }
    }

fonctionne absolument bien 

0
Falak Shah

Votre identifiant peut-il être associé à l’élément de données affiché dans le gridview?

Si c'est le cas, vous pouvez utiliser e.Row.DataItem et le convertir en n'importe quel type.

0
Andrew Bullock

JohnB, votre code fonctionne très bien, j'ai ajouté juste un petit bidou pour éviter d'alterner avec RowStyle après la souris.

e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=''");

Changé en:

e.Row.Attributes.Add("onmouseout", "if(" + e.Row.RowIndex + "% 2 == 0) { this.style.backgroundColor=''; } else { this.style.backgroundColor = '#E8F7EA'; }");

S'il y a une meilleure façon de le faire, s'il vous plaît faites le moi savoir, mais cela fonctionne parfaitement pour moi.

Salutations.

0
sh4