web-dev-qa-db-ja.com

RowDataBoundイベントのグリッドビューからセルから値を取得

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

GridViewでいくつかの動的なことをしようとしているので、RowDataBoundイベントにコードを接続しました。 TemplateFieldである特定のセルから値を取得しようとしています。しかし、上記のコードは常に空の文字列を返しているようです。

何か案は?

明確にするために、ここに問題のセルが少しあります:

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

関連するメモでは、行のセルを選択するより良い方法があるかどうか誰もが知っていますか? cell[1]。できませんでしたcell["mycellname"]なので、セルの順序を変更することにした場合、バグは表示されませんか?

31
qui

まず、適切に参照できるように、コードをLabelまたはLiteralコントロールでラップする必要があります。何が起こっているのかというと、テキストに関連付けられたコントロールがないため、システムがそれを追跡する方法がありません。その内容をビューステートに追加するのはコントロールの責任です。

GridView.FindControl( "controlName");を使用する必要があります。行のコントロールを取得します。そこから、Textなどのプロパティを取得できます。

また、問題の行のDataItemプロパティを取得して適切な型にキャストし、情報を直接抽出することもできます。

11
Orion Adrian

データをデータソースから直接引き出してみませんか。

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

TemplateFieldを使用してリテラルテキストをバインドしているとき、asp.netは実際にコントロールを挿入します! DataBoundLiteralControlに配置されます。空のテキストを取得しているコード行の近くでデバッガーを見ると、これを見ることができます。

したがって、コントロールを使用するようにテンプレートを変更せずに情報にアクセスするには、次のようにキャストします。

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

それはあなたのテキストを取得します!

23
Chris

上記は良い提案ですが、リテラルまたはラベルコントロールでラップすることなく、グリッドビューでセルのテキスト値を取得できます。あなたは、どのイベントを結びつけるかを知る必要があります。この場合、次のように代わりに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;
        }
    }
}

デバッガーを実行すると、このメソッドにテキストが表示されます。

13
Harry

たとえば、ループを使用してグリッドビューでセルを確認します。

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

同様の質問がありましたが、解決策はわずかに異なるアプローチで見つかりました。 Chrisが提案したようにコントロールを検索する代わりに、最初に.aspxページでフィールドが指定される方法を変更しました。 <asp:TemplateField ...>タグを使用する代わりに、問題のフィールドを<asp:BoundField ...>を使用するように変更しました。次に、RowDataBoundイベントに到達すると、セル内のデータに直接アクセスできます。

関連するフラグメント:最初に、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>

次に、RowDataBoundイベントで、値に直接アクセスできます。

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

誰かがwhyでコメントできるとしたら、これはありがたいです。 BoundFieldがないと、バインド後の値がセルにない理由は完全にはわかりませんが、コントロールを使用して検索する必要があります。

1
Mark Meuer

RowDataBound関数を使用してデータを特定のセルにバインドし、コントロールを使用します(DropDownListのようなASPコントロール名)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

Asp:BoundFieldの属性VisibleFalseに設定した場合。このような

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

not行をループするときにCells [i] .Textプロパティのテキストを取得します。そう

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

ただし、グリッドをOnRowDataBoundイベントに接続することにより、非表示の列を設定してから、ここからこれを実行できます。

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