it-swarm.com.de

Wie implementiere ich eine vollständige Zeilenauswahl in GridView ohne Auswahlschaltfläche?

Ich implementiere eine Funktion, bei der der Benutzer auf einen Punkt in der Zeile in einer GridView drückt und die Zeile anstelle der Schaltfläche Auswählen ausgewählt wird.

enter image description here

Um das zu implementieren, verwende ich den folgenden Code:

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, "");
    }
}

Mit dem obigen Code treten die folgenden Probleme auf:

  • Dies funktioniert nur, wenn ich EnableEventValidation für die Seite auf false gesetzt habe.
  • Das SelectedIndexChanged wird nur für den Fall ausgelöst, dass die Grid.DataBind() in Page_Load Für die Seite aufgerufen wird (in jedem Postback).

Mache ich etwas falsch? Gibt es eine bessere Implementierung?


Bearbeiten: Wenn EnableEventValidation auf true gesetzt ist, wird der folgende Fehler angezeigt:

Ungültiges Postback- oder Callback-Argument. Die Ereignisüberprüfung wird in der Konfiguration oder mit <% @ Page EnableEventValidation = "true"%> auf einer Seite aktiviert. Aus Sicherheitsgründen wird mit dieser Funktion überprüft, ob Argumente für Postback- oder Callback-Ereignisse von dem Serversteuerelement stammen, von dem sie ursprünglich gerendert wurden. Wenn die Daten gültig und erwartet sind, verwenden Sie die ClientScriptManager.RegisterForEventValidation-Methode, um die Postback- oder Callback-Daten für die Validierung zu registrieren.

30
Homam

Sie müssen dies bei jedem Postback hinzufügen und nicht nur bei der Datenbindung. Verwenden Sie dazu das RowCreated - Ereignis des GridView.

Beispielsweise

(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

Anstatt es auf RowCreated zu machen, könnten Sie es auf Render() machen. Auf diese Weise können Sie die Überladung von GetPostBackClientHyperlink mit true für registerForEventValidation verwenden und den Fehler "Ungültiges Postback/Callback-Argument" vermeiden.

Etwas wie das:

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

Versuchen Sie dieses Add OnSelectedIndexChanged-Ereignis im Raster

   OnSelectedIndexChanged="Grid_SelectedIndexChanged"

und dann auf Code dahinter

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

und setze EnableViewState = "false", aber hier musst du zwei weitere Dinge ausführen, die du bereits in deinem Code getan hast, was bedeutet, dass EnableEventValidation auf false und Grid Databinding auf Seite Load gesetzt ist.

0
Syeda