0

グリッドビューにバインドするデータテーブルがあります。列は可変なので、AutoGeneratedColumns を利用したいと思います。特定の条件で画像をバインドしたいと思います。私は何をする必要がありますか?

void GridView1_RowCreated(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    DataRowView drv = e.Row.DataItem as DataRowView;
    if (drv != null)
        drv[1] = new HtmlImage() { Src = "add.png" };
}
4

3 に答える 3

1

これは機能するはずです。実際のセルのコントロールを使用します。

void GridView1_RowCreated(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    HtmlImage img = new HtmlImage() { Src = "add.png" };
    e.Row.Cells[1].Controls.Add(img);
}
于 2013-07-17T14:03:46.130 に答える
1

列の型は GridView 全体に適用されるため、ここでは AutoGeneratedColumns プロパティは役に立たないようです。行ごとには計算されません。

データバインディングでTemplateFieldを使用して、コードを記述せずに各行のフィールドを条件付きでフォーマットできる場合があります。

それでもうまくいかない場合は、コードを作成する必要があると思います。RowCreated イベントは、行が作成されると常に発生します (ポストバックのイベントe.Row.DataItem) が、GridView が実際にデータバインディングのために DataSource に移動する場合にのみ、null 以外の DataItem () を提供することに注意してください。GridView がレンダリングされた状態を (ViewState で) キャッシュした場合、データ項目は null になります。その時点で、次のようなことを行うことによってのみ、行の主キー フィールドにアクセスできます: var keys = myGridView.DataKeys[rowIndex]; (主キー フィールドは、GridView のプロパティに指定した値によって決定さDataKeyNamesれ、ViewState に格納されるため、ポストバック。)

また、(ほとんどのフィールドがそうであるように) ある種の DataBoundField である列を変更する場合も注意が必要です。RowDataBound イベントは RowCreated イベントの後に発生するため、RowCreated イベント ハンドラーで行/セルの内容を手動で変更すると、RowDataBoundが発生したときにデータ バインドによって上書きされます。

そうは言っても、RowDataBound はおそらく必要なイベントです。

RowDataBound イベントは常に null 以外の DataItem を提供しますが、(ViewState からの "バインディング" とは対照的に) 実際のデータ バインディングが発生した場合にのみ発生します。そのため、通常、このイベントはポストバックではまったく発生しません。ただし、GridView はその状態を覚えているので問題ありません。

コードを使用する必要がある場合は、おそらく次のようになります。

//don't forget to attach this event handler, either in markup 
//on the GridView control, in code (say, in the Page_Init event handler.)
protected void GridView1_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
  //HtmlImage gives you a plain-vanilla <img> tag in the HTML.  
  //If you need to handle some server side events (such as Click)
  //for the image, use a System.Web.UI.WebControls.Image control
  //instead.
  HtmlImage img = new HtmlImage() { Src = "path/to/image.jpg" };
  e.Row.Cells[1].Controls.Add(img);
}

しかし、真剣に、最初に TemplateField をチェックしてください。

于 2013-07-17T16:19:50.797 に答える
1

RowDataBoundイベントを使用して各行を処理できます。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
      if (e.Row.RowType == DataControlRowType.DataRow)
      {
           DataRowView drv = e.Row.DataItem as DataRowView;
           if (drv != null)
           {
               // your code here...
           }
      }
}

このイベントの詳細については、こちらをご覧ください

于 2013-07-17T14:01:22.560 に答える