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.
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:
EnableEventValidation
pour la page est définie sur false
.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.
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
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);
}
<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>
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 ..