web-dev-qa-db-fra.com

Comment implémenter la sélection de ligne complète dans GridView sans bouton de sélection?

J'implémente une fonctionnalité qui, lorsque l'utilisateur appuie sur n'importe quel point de la ligne dans un GridView, la ligne sera sélectionnée au lieu du bouton Sélectionner.

enter image description here

Pour implémenter cela, j'utilise le code suivant:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Set the hand mouse cursor for the selected row.
        e.Row.Attributes.Add("OnMouseOver", "this.style.cursor = 'hand';");

        // The seelctButton exists for ensuring the selection functionality
        // and bind it with the appropriate event hanlder.
        LinkButton selectButton = new LinkButton()
        {
            CommandName = "Select",
            Text = e.Row.Cells[0].Text
        };

        e.Row.Cells[0].Controls.Add(selectButton);
        e.Row.Attributes["OnClick"] =
             Page.ClientScript.GetPostBackClientHyperlink(selectButton, "");
    }
}

Avec le code ci-dessus, il y a les problèmes suivants:

  • Cela ne fonctionne correctement que si I EnableEventValidation pour la page est définie sur false.
  • Le SelectedIndexChanged n'est déclenché qu'au cas où la Grid.DataBind() est appelée dans Page_Load Pour la page (dans chaque publication).

Est-ce que je fais quelque chose de mal? Y a-t-il une meilleure mise en œuvre?


Edit: Lorsque EnableEventValidation est défini sur true, l'erreur suivante apparaît:

Argument de publication ou de rappel non valide. La validation des événements est activée en utilisant dans la configuration ou <% @ Page EnableEventValidation = "true"%> dans une page. Pour des raisons de sécurité, cette fonctionnalité vérifie que les arguments des événements de publication ou de rappel proviennent du contrôle serveur qui les a rendus à l'origine. Si les données sont valides et attendues, utilisez la méthode ClientScriptManager.RegisterForEventValidation afin d'enregistrer les données de publication ou de rappel pour validation.

30
Homam

Vous devez l'ajouter sur chaque publication et pas seulement sur la liaison de données. Par conséquent, vous devez utiliser l'événement RowCreated - du GridView.

Par exemple

(C #):

protected void GridView1_RowCreated(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow) {
        e.Row.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';";
        e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';";
        e.Row.ToolTip = "Click to select row";
        e.Row.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView1, "Select$" + e.Row.RowIndex);
    }
}

(VB.Net):

Private Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated
    If e.Row.RowType = DataControlRowType.DataRow Then
        e.Row.Attributes("onmouseover") = "this.style.cursor='pointer';this.style.textDecoration='underline';"
        e.Row.Attributes("onmouseout") = "this.style.textDecoration='none';"
        e.Row.ToolTip = "Click to select row"
        e.Row.Attributes("onclick") = Me.Page.ClientScript.GetPostBackClientHyperlink(Me.GridView1, "Select$" & e.Row.RowIndex)
    End If
End Sub
46
Tim Schmelter

Au lieu de le faire sur RowCreated, vous pouvez le faire sur Render(). De cette façon, vous pourriez utiliser la surcharge de GetPostBackClientHyperlink avec true sur registerForEventValidation et éviter l'erreur "argument postback/callback invalide".

Quelque chose comme ça:

protected override void Render(HtmlTextWriter writer)
    {
      foreach (GridViewRow r in GridView1.Rows)
      {
        if (r.RowType == DataControlRowType.DataRow)
        {
          r.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';";
          r.Attributes["onmouseout"] = "this.style.textDecoration='none';";
          r.ToolTip = "Click to select row";
          r.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView1, "Select$" + r.RowIndex,true);

        }
      }

      base.Render(writer);
    }
13
alejandrobog
<style type="text/css">
    .hiddenColumn
    {
        display: none;
    }

    .rowGrid
    {
        cursor: pointer;
    }
</style>

<asp:GridView runat="server" ID="GridView1" AutoGenerateColumns="true" >
            <RowStyle CssClass="rowGrid" />
            <Columns>
                <asp:CommandField ButtonType="Button" ShowSelectButton="true" HeaderStyle-CssClass="hiddenColumn"
                    ItemStyle-CssClass="hiddenColumn" FooterStyle-CssClass="hiddenColumn" />
            </Columns>
        </asp:GridView>

<script type="text/javascript">
        $(function () {
            $("#<%= GridView1.ClientID %> tr.rowGrid")
            .live("click", function (event) {
                $(this).find("input[type='button'][value='Select']").click();
            });

            $("#<%= GridView1.ClientID %> input[type='button'][value='Select']")
                .live("click", function (event) {
                    event.stopPropagation();
                });

        });
    </script>
3

Essayez celui-ci, ajoutez l'événement OnSelectedIndexChanged dans la grille

   OnSelectedIndexChanged="Grid_SelectedIndexChanged"

puis sur le code derrière

 protected void Grid_SelectedIndexChanged(object sender, EventArgs e)
{
    GridViewRow row = gvSummary.SelectedRow;
    //Int32 myvalue= Convert.ToInt32(row.Attributes["ColumnName"].ToString());
   } 

et définissez EnableViewState = "false" mais ici vous devez effectuer deux autres choses que vous avez déjà faites dans votre code signifie définir EnableEventValidation sur false et Grid Databinding à la page Charger ..

0
Syeda