Frage

Wenn ich auf eine Zeile in meinem Gridview klicken, möchte ich mit der ID auf eine andere Seite gehen, ich aus der Datenbank erhalten.

In meinem RowCreated Ereignisse Ich habe die folgende Zeile:

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

Um zu verhindern, Fehlermeldungen Ich habe diesen 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);
}

Wie kann ich geben Sie eine Zeile eine eindeutige ID (aus dem DB) und wenn ich die Zeile klicken, wird eine andere Seite geöffnet (wie auf einem href klicken) und die Seite kann die ID lesen.

War es hilfreich?

Lösung

Ich habe die Lösung.

Dies ist, was ich getan habe:

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

Ich habe den vorhergehenden Code in dem RowDataBound Ereignisse geputtet.

Andere Tipps

Martijn,

Hier ist ein weiteres Beispiel mit einigen geschickten Zeilen markieren und a href Stil Cursor:

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

Der obige Code funktioniert in .NET 3.5. Sie können jedoch nicht die id-Spalte auf Sichtbar gesetzt = „false“, weil es einen leeren Abfrage-String-Wert für Ihren ID-Schlüssel erhalten:

<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>

ändern So die erste Spalte auf diese statt:

<asp:BoundField DataField="id" ItemStyle-CssClass="hide" />

Fügen Sie diese CSS oben auf Ihrer Seite:

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

Aber die erste Zelle Ihrer Kopfzeile zu verstecken, fügen Sie diese zu Ihrem gvSearch_RowDataBound () in Code-behind:

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

Offensichtlich Sie die ID-Spalte in Code-behind versteckt zu können, aber dies in mehr Text in Ihrem Markup als eine CSS-Klasse führen wird:

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

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

   }  
}  

Kann Ihre ID zu dem Datenelement in der Gridview angezeigt zusammenhängen?

Wenn ja, können Sie e.Row.DataItem verwenden und werfen sie zu welcher Art auch immer es ist.

Sie können die RowCommand Ereignis der Rasteransicht für sie verwenden. In Ihrem Button / Link, wo Sie wnat auf den Klick zu setzen, stellen Sie den Commandname und Commandargument, die Sie an der EventArgs Paramter des Ereignismethode accees kann.

Zeile Klick in der Rasterdarstellung auf andere Seite umleiten

    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 + "'";
        }
    }

arbeitet absolut in Ordnung

JohnB, Ihr Code funktioniert sehr gut, habe ich nur noch ein wenig Hack Alter ruiniert nach mouseout zu vermeiden.

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

geändert:

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

Wenn es ein besserer Weg, es zu tun, lass es mich wissen, aber es funktioniert perfekt für mich.

Grüße.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top