it-swarm-eu.dev

Získání hodnoty z buňky z gridview na události RowDataBound

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

Snažím se dělat nějaké dynamické věci se svým GridView, takže jsem zapojil nějaký kód na událost RowDataBound. Snažím se získat hodnotu z určité buňky, což je TemplateField. Zdá se však, že výše uvedený kód vždy vrací prázdný řetězec. 

Nějaké nápady?

Pro objasnění je zde trochu urážlivá buňka:

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

Na související poznámku, ví někdo, zda existuje lepší způsob výběru buňky v řádku. To saje uvedení v cell[1]. Nemohu udělat cell["mycellname"], takže pokud se rozhodnu změnit pořadí mých buněk, nezobrazí se chyby?

29
qui

Nejdříve je třeba zabalit kód do ovládacího prvku Label nebo Literal tak, abyste na něj mohli správně odkazovat. To, co se děje, je, že neexistuje žádný způsob, jak systém sledovat, protože s textem není spojena žádná kontrola. Je povinností kontroly přidat obsah do prohlížeče.

Musíte použít gridView.FindControl ("controlName"); získat kontrolu v řadě. Odtud se můžete dostat k jeho vlastnostem včetně Text.

Můžete se také dostat do vlastnosti DataItem daného řádku a přenést ji na příslušný typ a získat informace přímo.

11
Orion Adrian

proč ne tahat data přímo ze zdroje dat.

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

Když použijete TemplateField a vázáte na něj doslovný text, jako to děláte, asp.net skutečně vloží ovládací prvek PRO VÁS! Dostane se do DataBoundLiteralControl. Můžete vidět, pokud se podíváte do ladicího programu v blízkosti řádku kódu, který je dostat prázdný text.

Chcete-li tedy získat přístup k informacím bez změny šablony, abyste mohli použít ovládací prvek, hodili byste takto:

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

To vám dá váš text!

21
Chris

Výše uvedené jsou dobré návrhy, ale můžete získat na textovou hodnotu buňky v zobrazení mřížky bez toho, aby ji zabalili do doslovného nebo štítkového ovládacího prvku. Musíte prostě vědět, jakou událost zapojit. V takovém případě použijte namísto toho událost DataBound:

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

Při spuštění ladicího programu se zobrazí text v této metodě.

12
Harry

Stačí použít smyčku pro kontrolu vaší buňky v mřížce, například:

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

Měl jsem podobnou otázku, ale řešení jsem našel poněkud odlišným přístupem. Místo toho, aby vzhlédl ke kontrole, jak navrhl Chris, jsem poprvé změnil způsob, jakým bylo pole zadáno na stránce .aspx. Namísto použití <asp:TemplateField ...> tagu jsem změnila příslušné pole a použila <asp:BoundField ...>. Pak, když jsem se dostal k události RowDataBound, data mohla být zpřístupněna přímo v buňce. 

Příslušné fragmenty: Nejprve stránka aspx:

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

Potom v události RowDataBound mohu přistupovat k hodnotám přímo:

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

Pokud by někdo mohl komentovat proč to funguje, ocenil bych to. Nemám plně pochopit, proč bez BoundField hodnota není v buňce po vázání, ale musíte se podívat přes kontrolu.

1
Mark Meuer

použijte funkci RowDataBound pro vazbu dat s konkrétní buňkou a pro použití kontroly (ASP Control Name jako 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

Pokud nastavíte atribut Visible na asp: BoundField to False . Takhle

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

Při smyčkování řádků budete ne dostávat libovolný Text ve vlastnosti Cells [i] .Text. Tak

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

Můžete však nastavit sloupec, který není viditelný, připojením mřížky k události OnRowDataBound a pak zde

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