33
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"]たので、セルの順序を変更することにした場合、バグは発生しませんか?

4

12 に答える 12

55

データ ソースから直接データを取得してみませんか。

DataBinder.Eval(e.Row.DataItem, "ColumnName")
于 2008-09-23T15:29:31.450 に答える
23

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

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

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

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

于 2008-10-07T18:50:40.587 に答える
14

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

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

于 2009-04-10T15:46:18.297 に答える
13

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

gridView.FindControl("controlName"); を使用する必要があります。行のコントロールを取得します。そこから、 を含むそのプロパティにアクセスできますText

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

于 2008-09-23T15:28:42.887 に答える
6

たとえば、ループを使用してグリッドビューでセルをチェックするだけです。

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 
    }
}
于 2011-03-30T19:39:57.927 に答える
1

同様の質問がありましたが、少し異なるアプローチで解決策を見つけました。クリスが提案したようにコントロールを検索する代わりに、最初に.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";
    }
}

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

于 2012-09-27T16:33:52.713 に答える
0
Label lblSecret = ((Label)e.Row.FindControl("lblSecret"));
于 2012-08-23T12:09:18.990 に答える
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");
}
于 2014-10-09T02:12:48.287 に答える
-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);
    }
}
于 2015-04-05T04:39:48.260 に答える