C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: GridViewのButtonField表示がおかしい


(過去ログ 80 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■46965 / inTopicNo.1)  GridViewのButtonField表示がおかしい
  
□投稿者/ しょう (1回)-(2010/02/15(Mon) 11:44:00)

分類:[ASP.NET (C#)] 

分類:[ASP.NET (C#)] 

不可解な現象が・・・というかこれが正しい動きなの?

GridViewがあります。

ボタンを押した時にOnRowDataBoundで以下を処理
・初期値から値を変更→ButtonFieldのTextをnullまたはブランクにしています。(ボタンを押せなくするために)
・初期値から値を変更→BoundFieldのTextをnullまたはブランクにしています。(みえなくするため)

ここまではうまく行きます。

その後、そのGridViewが入ってるUpdatePanelをVisible=falseにしてから、Trueにすると、そのButtonFieldのTextが初期値に戻ります。 BoundFieldのTextは初期値には戻らずブランクの状態です。

GridViewが再作成されているわけでは無さそうです。なぜならOnRowDataBoundはパネル開閉では実行されていません。

BoundFieldがブランクのままなのは正しいと思います。 が・・・なぜButtonFieldは初期値に戻ってしますのでしょうか? 
引用返信 編集キー/
■46998 / inTopicNo.2)  Re[1]: GridViewのButtonField表示がおかしい
□投稿者/ もりお (186回)-(2010/02/15(Mon) 21:50:39)
2010/02/15(Mon) 21:52:40 編集(投稿者)
No46965 (しょう さん) に返信

> ・初期値から値を変更→ButtonFieldのTextをnullまたはブランクにしています。(ボタ
> ンを押せなくするために)
> ・初期値から値を変更→BoundFieldのTextをnullまたはブランクにしています。(みえ
> なくするため)

ButtonField と BoundField の Text プロパティにはどの様にしてブランクをセットされ
ているのでしょうか。
BoundField に Text プロパティがないことに鑑みると

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
  e.Row.Cells[0].Text = "";
}

こんな感じでしょうか。
この場合 TableCell の Text プロパティに値がセットされます。

> GridViewが再作成されているわけでは無さそうです。なぜなら OnRowDataBoundはパネ
> ル開閉では実行されていません。

そうすると原因はポストバック時における ViewState からの値の復元にありそうです。
ViewState からの値復元時に TableCell の Text プロパティの値が ButtonField の
Text プロパティの値で上書きされるのかなと思ったり思わなかったりです。

TableCell から ButtonField を取得して Text プロパティをセットしてみてはいかがで
しょうか。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
  DataControlFieldCell dataControlFieldCell = e.Row.Cells[0] as DataControlFieldCell;
  ButtonField buttonField = dataControlFieldCell.ContainingField as ButtonField;
  buttonField.Text = "";
}

引用返信 編集キー/
■47139 / inTopicNo.3)  Re[2]: GridViewのButtonField表示がおかしい
□投稿者/ しょう (2回)-(2010/02/18(Thu) 20:52:26)
>
> ButtonField と BoundField の Text プロパティにはどの様にしてブランクをセットされ
> ているのでしょうか。
> BoundField に Text プロパティがないことに鑑みると
>
> protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
> {
> e.Row.Cells[0].Text = "";
> }
>
> こんな感じでしょうか。
> この場合 TableCell の Text プロパティに値がセットされます。
>

はい、まさにその通りです。
ButtonFieldではなく正しくはセルですよね。

>>GridViewが再作成されているわけでは無さそうです。なぜなら OnRowDataBoundはパネ
>>ル開閉では実行されていません。
>
> そうすると原因はポストバック時における ViewState からの値の復元にありそうです。
> ViewState からの値復元時に TableCell の Text プロパティの値が ButtonField の
> Text プロパティの値で上書きされるのかなと思ったり思わなかったりです。
>
> TableCell から ButtonField を取得して Text プロパティをセットしてみてはいかがで
> しょうか。
>
> protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
> {
> DataControlFieldCell dataControlFieldCell = e.Row.Cells[0] as DataControlFieldCell;
> ButtonField buttonField = dataControlFieldCell.ContainingField as ButtonField;
> buttonField.Text = "";
> }
>

これを試してみました。
しかし、RowDataBoundでセットしてもうまく行きません。

どうやらOnRowCreatedでセットしないとだめなようです。

しかしデータを元に変更したいのでOnRowCreatedでは判断のしようが
無いんですよね・・・

とりあえず中間報告です!



引用返信 編集キー/
■47167 / inTopicNo.4)  Re[3]: GridViewのButtonField表示がおかしい
□投稿者/ しょう (4回)-(2010/02/19(Fri) 17:14:47)
>
> これを試してみました。
> しかし、RowDataBoundでセットしてもうまく行きません。
>

どううまくいかないか書いてませんでした。

DataControlFieldCell dataControlFieldCell(DataControlFieldCell)e.Row.Cells[0];
ButtonField buttonField = (ButtonField)dataControlFieldCell.ContainingField;
buttonField.Text = "";

としてみると、Viewstateから復元の時に、全部のLINKBUTTONが消えてしまいます。

デバッグでRowDataBoundの実行を追っていると、想定している行だけが上記ロジックを通過し
それ以外の行では実行されてないのですが、なぜか全部のrowのLINKBUTTONに適用されて
いるようです。

引用返信 編集キー/
■47170 / inTopicNo.5)  Re[4]: GridViewのButtonField表示がおかしい
□投稿者/ pouch (1回)-(2010/02/19(Fri) 19:00:36)
こんにちは。

RowDataBoundイベントだと、DataBindした時しか通らないので、
毎回通るOnPreRenderあたりで

protected override void OnPreRender(EventArgs e)
{
 foreach (GridViewRow row in this.CtrlGridView.Rows)
 {
  if(非表示条件)
  {
   row.Cells[0].Text = string.Empty;//空っぽにする
  }
 }
 base.OnPreRender(e);
}

空文字を入れてしまうとかどうでしょうか?

引用返信 編集キー/
■47214 / inTopicNo.6)  Re[5]: GridViewのButtonField表示がおかしい
□投稿者/ しょう (7回)-(2010/02/22(Mon) 10:19:35)
教えて頂いた方法で、実装したところ解決しました!!

完璧です。

具体的にはほぼ同じですが、GridViewのOnPreRenderイベント実装しました。
こんな感じです。

protected void GridView_OnPreRender(object sender, EventArgs e)
{
foreach (GridViewRow row in this.GridView.Rows)
{
if (row.Cells[5].Text == "")
{
row.Cells[0].Text = string.Empty;//空っぽにする
}
}
}

皆様、ありがとうございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -