2008-09-23 3 views
28
string percentage = e.Row.Cells[7].Text; 

Ich versuche, etwas dynamisches Zeug mit meinem GridView zu tun, also habe ich Code an das RowDataBound-Ereignis verdrahtet. Ich versuche, den Wert von einer bestimmten Zelle zu erhalten, die ein TemplateField ist. Aber der obige Code scheint immer eine leere Zeichenfolge zurückzugeben.Wert von einer Zelle aus einer Gridview auf RowDataBound-Ereignis erhalten

Irgendwelche Ideen?

, hier Um zu klären, ist ein bisschen die säumige Zelle:

<asp:TemplateField HeaderText="# Percentage click throughs"> 
<ItemTemplate> 
    <%# AddPercentClickThroughs((int)Eval("EmailSummary.pLinksClicked"), (int)Eval("NumberOfSends")) %> 
</ItemTemplate> 
</asp:TemplateField> 

Auf einem verwandten beachten, weiß jemand, ob es eine bessere Art und Weise der Auswahl der Zelle in der Reihe ist. Es saugt das Einsetzen cell[1]. Könnte ich nicht tun cell["mycellname"], also, wenn ich entscheide, die Reihenfolge meiner Zellen zu ändern, werden Fehler nicht angezeigt?

+0

Sind Sie Databinding auf jedem Postback? Hast du Postbacks? –

Antwort

11

Zuerst müssen Sie Ihren Code in ein Label oder Literal Steuerelement einwickeln, damit Sie es richtig verweisen können. Was passiert ist, dass es für das System keine Möglichkeit gibt, den Überblick zu behalten, da mit dem Text keine Kontrolle verbunden ist. Es liegt in der Verantwortung des Steuerelements, den Inhalt zu Viewstate hinzuzufügen.

Sie müssen gridView.FindControl ("controlName") verwenden; um die Kontrolle in der Reihe zu bekommen. Von dort können Sie in seinen Eigenschaften einschließlich Text erhalten.

Sie können auch die DataItem-Eigenschaft der betreffenden Zeile abrufen und sie in den entsprechenden Typ umwandeln und die Informationen direkt extrahieren.

+0

Aber ich habe nicht wirklich eine Kontrolle (die ich kenne!) In der Zelle, ich benutze nur eine Methode, um eine Zeichenfolge dort – qui

+2

Sie müssen nicht Ihren Code in einem Label oder Literal zu wickeln. Siehe meine Antwort unten. – Chris

+0

Woche Lösung, es gibt einen besseren Weg, das zu tun. –

45

Warum nicht die Daten direkt aus der Datenquelle ziehen.

+0

Es ist nicht in der Datenquelle, es wird dynamisch generiert, ich habe meine Frage zu klären – qui

+1

Ihre Antwort möglicherweise nicht auf die Frage des OP, aber es hat mir geholfen. Ich habe versucht, den Wert eines TextBox-Felds im Kennwortmodus in einem TemplateField in einer GridView zu ermitteln, sodass ich Sternchen in der TextBox auf RowDataBound zuweisen konnte (standardmäßig wird nichts in TextBoxen im Kennwortmodus angezeigt). DataBinder.Eval() hat den Trick gemacht. –

+1

heh danke für dieses verrückte alte Ich weiß, aber es hat mir sehr geholfen. – Loktar

21

Wenn Sie ein TemplateField verwenden und literalen Text daran binden, wie Sie es tun, wird asp.net tatsächlich ein Steuerelement für Sie einfügen! Es wird in ein DataBoundLiteralControl eingefügt. Sie können dies sehen, wenn Sie im Debugger in der Nähe Ihrer Codezeile suchen, die den leeren Text erhält.

Also, auf die Informationen zuzugreifen, ohne die Vorlage Ändern einer Steuerung zu verwenden, soll diese Stimmen:

string percentage = ((DataBoundLiteralControl)e.Row.Cells[7].Controls[0]).Text; 

, dass Sie Ihren Text erhalten!

+0

wollte nur Ihre Lösung kommentieren. Ich habe es mit dem folgenden Fehler versucht ... Server Fehler in '/ WebSite2' Anwendung. ------- Das Objekt des Typs 'System.Web.UI.LiteralControl' kann nicht in den Typ 'System.Web.UI.DataBoundLiteralControl' umgewandelt werden. Ausnahmedetails: System.InvalidCastException: Darf das Objekt des Typs 'System.Web.UI.LiteralControl' nicht in den Typ 'System.Web.UI.DataBoundLiteralControl' umwandeln. Quellfehler: Zeile 68: Dim Prozentsatz As String = DirectCast (e.Row.Cells (8) .Controls (0), DataBoundLiteralControl) .Text ...... Ich verpasste, dass dies ein alter Beitrag war. – htm11h

+0

Hallo Chris Ich möchte meine erste Spalte aus der Gridview holen, kann ich verwenden - "String Prozent = ((DataBoundLiteralControl) e.Row.Cells [0] .Controls [0]). Text;' Oder wie kann ich finden der Index der Zellen und Kontrollen !! – Jithu

11

Die obigen sind gute Vorschläge, aber Sie können den Textwert einer Zelle in einer Rasteransicht erhalten, ohne sie in ein Literal oder Label-Steuerelement zu wickeln. Sie müssen nur wissen, welches Ereignis zu verkabeln ist. In diesem Fall verwenden Sie die Databound-Ereignis statt, etwa so:

protected void GridView1_DataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     if (e.Row.Cells[0].Text.Contains("sometext")) 
     { 
      e.Row.Cells[0].Font.Bold = true; 
     } 
    } 
} 

Wenn ein Debugger ausgeführt wird, sehen Sie den Text in dieser Methode erscheinen.

+0

Das hat bei mir perfekt funktioniert - Danke – leen3o

+2

So schlau um zu prüfen, ob die aktuelle Zeile eine Datenzeile ist –

6

einfach eine Schleife verwenden, um Ihre Zelle in einem gridview zum Beispiel zu überprüfen:

for (int i = 0; i < GridView2.Rows.Count; i++) 
{ 
    string vr; 
    vr = GridView2.Rows[i].Cells[4].Text; // here you go vr = the value of the cel 
    if (vr == "0") // you can check for anything 
    { 
     GridView2.Rows[i].Cells[4].Text = "Done"; 
     // you can format this cell 
    } 
} 
1

Verwendung RowDataBound Funktionsdaten mit einer perticular Zelle zu binden und Steuer Verwendung (ASP Control Name wie Dropdownlist) GridView.FindControl("Name of Control") zu erhalten

0
Label lblSecret = ((Label)e.Row.FindControl("lblSecret")); 
1

Ich hatte eine ähnliche Frage, aber fand die Lösung durch einen etwas anderen Ansatz.Anstatt das Steuerelement wie von Chris vorgeschlagen nachzuschauen, änderte ich zuerst die Art, wie das Feld in der ASPX-Seite angegeben wurde. Anstatt ein <asp:TemplateField ...> Tag zu verwenden, habe ich das betreffende Feld geändert, um <asp:BoundField ...> zu verwenden. Als ich dann zum RowDataBound-Ereignis kam, konnte direkt auf die Daten in der Zelle zugegriffen werden.

Die entsprechenden Fragmente: Erstens, die aspx Seite:

<asp:GridView ID="gvVarianceReport" runat="server" ... > 
...Other fields... 
    <asp:BoundField DataField="TotalExpected" 
    HeaderText="Total Expected <br />Filtration Events" 
    HtmlEncode="False" ItemStyle-HorizontalAlign="Left" 
    SortExpression="TotalExpected" /> 
... 
</asp:Gridview> 

Dann im RowDataBound Ereignis kann ich die Werte direkt zugreifen:

protected void gvVarianceReport_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    if (e.Row.Cells[2].Text == "0") 
    { 
     e.Row.Cells[2].Text = "N/A"; 
     e.Row.Cells[3].Text = "N/A"; 
     e.Row.Cells[4].Text = "N/A"; 
    } 
} 

Wenn jemand auf warum diese Werke kommentieren könnte , Ich würde es begrüßen. Ich verstehe nicht ganz, warum der Wert ohne das BoundField nicht in der Zelle nach der Bindung ist, aber Sie müssen es über das Steuerelement nachschlagen.

0
<asp:TemplateField HeaderText="# Percentage click throughs"> 
    <ItemTemplate> 
    <%# AddPercentClickThroughs(Convert.ToDecimal(DataBinder.Eval(Container.DataItem, "EmailSummary.pLinksClicked")), Convert.ToDecimal(DataBinder.Eval(Container.DataItem, "NumberOfSends")))%> 
    </ItemTemplate> 
</asp:TemplateField> 


public string AddPercentClickThroughs(decimal NumberOfSends, decimal EmailSummary.pLinksClicked) 
{ 
    decimal OccupancyPercentage = 0; 
    if (TotalNoOfRooms != 0 && RoomsOccupied != 0) 
    { 
     OccupancyPercentage = (Convert.ToDecimal(NumberOfSends)/Convert.ToDecimal(EmailSummary.pLinksClicked) * 100); 
    } 
    return OccupancyPercentage.ToString("F"); 
} 
-1
protected void gvbind_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     e.Row.Attributes["onmouseover"] = "this.style.cursor='hand';"; 
     e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';"; 
     e.Row.Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(this.gvbind, "Select$" + e.Row.RowIndex); 
    } 
} 
0

Wenn Sie das Attribut Visible auf der asp gesetzt: Boundfield zu Falsch. Gefällt Ihnen dieses

<asp:BoundField DataField="F1" HeaderText="F1" Visible="False"/> 

Sie werden nicht erhalten einen beliebigen Text in den Zellen [i] .Text Eigenschaft, wenn Sie Schleife die Zeilen. So

foreach (GridViewRow row in myGrid.Rows) 
{ 
    userList.Add(row.Cells[0].Text); //this will be empty "" 
} 

Aber Sie können eine Spalte nicht sichtbar durch das Gitter auf das Ereignis eingestellt Verbindungs ​​OnRowDataBound dann von hier aus das tun

e.Row.Cells[0].Visible = false //now the cell has Text but it's hidden