web-dev-qa-db-de.com

Abrufen eines Werts aus einer Zelle aus einer Rasteransicht für das RowDataBound-Ereignis

string percentage = e.Row.Cells[7].Text;

Ich versuche etwas dynamisches mit meiner GridView zu machen, also habe ich etwas Code mit dem RowDataBound-Ereignis verbunden. Ich versuche, den Wert aus einer bestimmten Zelle abzurufen, bei der es sich um ein TemplateField handelt. Der obige Code scheint jedoch immer eine leere Zeichenfolge zurückzugeben. 

Irgendwelche Ideen?

Um dies zu verdeutlichen, ist hier die etwas beleidigende Zelle:

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

Weiß jemand, ob es eine bessere Möglichkeit gibt, die Zelle in der Zeile auszuwählen. Es saugt cell[1]. Könnte ich nicht cell["mycellname"] tun, wenn also ich die Reihenfolge meiner Zellen ändern möchte, treten keine Fehler auf?

29
qui

Zuerst müssen Sie Ihren Code in ein Label- oder Literal-Steuerelement einschließen, damit Sie richtig darauf verweisen können. Was passiert, ist, dass das System keine Möglichkeit hat, den Überblick zu behalten, da mit dem Text keine Kontrolle verbunden ist. Es liegt in der Verantwortung des Steuerelements, seinen Inhalt zum Ansichtsstatus hinzuzufügen.

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

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

11
Orion Adrian

warum ziehen Sie die Daten nicht direkt aus der Datenquelle.

DataBinder.Eval(e.Row.DataItem, "ColumnName")
49

Wenn Sie ein TemplateField verwenden und wie Sie buchstäblichen Text daran binden, fügt asp.net tatsächlich ein Steuerelement FÜR SIE ein! Es wird in ein DataBoundLiteralControl eingefügt. Sie können dies sehen, wenn Sie im Debugger neben Ihrer Codezeile suchen, die den leeren Text enthält.

Um auf die Informationen zuzugreifen, ohne Ihre Vorlage für die Verwendung eines Steuerelements zu ändern, würden Sie folgendermaßen umsetzen:

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

Das bringt dir deinen Text!

21
Chris

Die oben genannten Vorschläge sind gute Vorschläge. Sie können jedoch den Textwert einer Zelle in einer Rasteransicht anzeigen, ohne sie in ein Literal- oder Label-Steuerelement zu packen. Sie müssen nur wissen, welche Veranstaltung Sie verbinden müssen. In diesem Fall verwenden Sie stattdessen das DataBound-Ereignis wie folgt:

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 Sie einen Debugger ausführen, wird der Text in dieser Methode angezeigt.

12
Harry

Verwenden Sie einfach eine Schleife, um beispielsweise Ihre Zelle in einer Rasteransicht 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 
    }
}
6
Ahmad

Ich hatte eine ähnliche Frage, fand die Lösung jedoch durch einen etwas anderen Ansatz. Anstatt das Steuerelement nach den Vorschlägen von Chris nachzuschlagen, änderte ich zunächst die Art und Weise, wie das Feld auf der ASPX-Seite angegeben wurde. Anstelle eines <asp:TemplateField ...>-Tags habe ich das betreffende Feld geändert, um <asp:BoundField ...> zu verwenden. Wenn ich dann zum RowDataBound-Ereignis kam, konnte auf die Daten direkt in der Zelle zugegriffen werden. 

Die relevanten Fragmente: Zuerst 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>

Im RowDataBound-Ereignis kann ich dann direkt auf die Werte 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 zu warum dies funktioniert, kommentieren kann, wäre ich dankbar. Ich verstehe nicht ganz, warum sich der Wert ohne BoundField nach dem Bind nicht in der Zelle befindet, aber Sie müssen ihn über das Steuerelement nachschlagen.

1
Mark Meuer

verwenden Sie die Funktion RowDataBound, um Daten mit einer bestimmten Zelle zu verknüpfen und die Verwendung der Kontrolle zu erhalten (ASP-Steuerungsname wie DropDownList) GridView.FindControl("Name of Control")

1
SEO Service
<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");
}
0
user3679550
Label lblSecret = ((Label)e.Row.FindControl("lblSecret"));
0
Vaibhav Saran

Wenn Sie das Attribut Visible im asp: BoundField auf False setzen. So was

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

Sie erhalten not keinen Text in der Cells [i] .Text-Eigenschaft, wenn Sie die Zeilen durchlaufen. So

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

Sie können eine Spalte jedoch nicht sichtbar setzen, indem Sie das Raster mit dem Ereignis OnRowDataBound verbinden

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