- PR -

DataGridのButtonColumnにある特定のボタンを非表示にしたい

1
投稿者投稿内容
@beginner
会議室デビュー日: 2007/02/16
投稿数: 9
投稿日時: 2007-03-02 14:22
ASP.NETで開発中の初心者の@beginnerです。
よろしくお願いします。

現在、DataGridにButtonColumnで配置した削除ボタンを
ある条件で1行目にある削除ボタンのみ非表示にし、
残りの行には削除ボタンを表示させたいのです。

e.Item.Cells(0)やe.Item.ItemIndex、e.Item.Controls
などを使うと全ての行にある削除ボタンが非表示に
なってしまい、
以下の過去レスをヒントにできるかなと思いましたが、
よく理解できておりません。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3930&forum=7

下記のようなイメージなのですが、
どなたかヒントをご教授いただけないでしょうか。
よろしくお願いします。

-----------------------------------
テキスト | 削除ボタン(非表示)
-----------------------------------
テキスト | 削除ボタン(表示)
-----------------------------------
テキスト | 削除ボタン(表示)
-----------------------------------

・Windows XP
・Visual Studio .NET 2003
・.NET Framework v1.1
・VBで開発
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-03-02 14:51
引用:

@beginnerさんの書き込み (2007-03-02 14:22) より:
e.Item.Cells(0)やe.Item.ItemIndex、e.Item.Controls
などを使うと全ての行にある削除ボタンが非表示に
なってしまい、


ItemDataBoundイベントでやってるんですよね?
使うプロパティとかは間違ってなさそうですが・・・

デバッグした?全行が非表示にする方を通ってない?
@beginner
会議室デビュー日: 2007/02/16
投稿数: 9
投稿日時: 2007-03-02 15:41
かめたろさんレスありがとうございます。

そうなんです。
ItemDataBoundイベント内でやってるんですが・・・
全行の表示・非表示はできるのですが、
「一行目だけ」非表示ができないのです。

未だ試行錯誤中です。
以下の e.Item.ItemIndex は DataGrid に
データバインドされた行数しか取得していません。
実際はもっと行数があるのですが、表示もされません。
例:データバインドされなければいけない行数10行。
  実際表示されるのは2行。
データバインドされなければいけない行数は
どうやって取得すればいいのか理解できていません。
しかも以下のソースだと削除ボタンが効かなくなってしまいました。

If Session("ID") = "" Then
 '削除ボタン/一行目非表示・一行目以降表示
 Dim i As Integer
 For i = 0 To e.Item.ItemIndex
  e.Item.Cells(1).Controls(i).Visible = True
 Next
 e.Item.Cells(1).Controls(0).Visible = False
Else
 '削除ボタン全行表示
 DataGrid1.Columns(1).Visible = True
End If

[ メッセージ編集済み 編集者: @beginner 編集日時 2007-03-02 17:00 ]
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-03-02 18:03
引用:

@beginnerさんの書き込み (2007-03-02 15:41) より:
If Session("ID") = "" Then
 '削除ボタン/一行目非表示・一行目以降表示
 Dim i As Integer
 For i = 0 To e.Item.ItemIndex
  e.Item.Cells(1).Controls(i).Visible = True
 Next
 e.Item.Cells(1).Controls(0).Visible = False
Else
 '削除ボタン全行表示
 DataGrid1.Columns(1).Visible = True
End If


ああ、コレ、Session("ID") = "" の場合は全行非表示になりそうね。Elseの方もちょっとどうかと・・・。ItemDataBoundはどういうイベントなのか、ItemIndexは何かってところをもう一度確認することをお勧めします。
@beginner
会議室デビュー日: 2007/02/16
投稿数: 9
投稿日時: 2007-03-05 11:46
かめたろさんレスありがとうございます。

ItemDataBoundはどういうイベントなのか、
ItemIndexは何かってところをもう一度確認したのですが、
いまだ解決にはいたっていません。
まだまだ理解不足で頂いたヒントから発想できていません。

ItemDataBoundでは削除ボタンの全表示か全非表示させるだけで、
別のイベントで特定の削除ボタンの表示・非表示を
すればよいのでしょうか。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-03-05 12:51
引用:
ItemDataBoundはどういうイベントなのか、
ItemIndexは何かってところをもう一度確認したのですが、

確認して理解したけどこの問題については解決できなかったのか、
確認したけど理解できていないのか。そもそも何を根拠にああいうコードになったのでしょうか。

ItemDataBoundはその行がバインド(コントロールとデータが結びつかられるたびに)される度に発生します。
ItemIndexは大雑把に言えば「その行が何行目なのか」です。それをiとして
e.Item.Cells(1).Controls(i)
つまり2個目のセルのi番目のコントロール、をとるのはおかしいですよね。
@beginner
会議室デビュー日: 2007/02/16
投稿数: 9
投稿日時: 2007-03-05 15:52
べるさんレスありがとうございます。
べるさん・かめたろさんに指摘いただいた点を
じっくり読んで試行錯誤して下記まできました。
考え方としては理解できてきているでしょうか。
下記より「未だ理解できていないなぁ」と思う点があれば
アドバイスしていただけないでしょうか。
よろしくお願いします。

If Session("ID") = "" Then
 '削除ボタン/1行目非表示・2行目以降表示
 'もしデータ連結1行目なら
 If e.Item.ItemIndex = 0 Then
  e.Item.Cells(1).Controls(0).Visible = False
 'データ連結2行目以降なら
 ElseIf e.Item.ItemIndex >= 1 Then
  e.Item.Cells(1).Visible = True
 End If
Else
 '削除ボタン全表示
 DataGrid1.Columns(4).Visible = True
End If
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-03-05 17:36
引用:

@beginnerさんの書き込み (2007-03-05 15:52) より:

If Session("ID") = "" Then
 '削除ボタン/1行目非表示・2行目以降表示
 'もしデータ連結1行目なら
 If e.Item.ItemIndex = 0 Then
  e.Item.Cells(1).Controls(0).Visible = False
 'データ連結2行目以降なら
 ElseIf e.Item.ItemIndex >= 1 Then
  e.Item.Cells(1).Visible = True
 End If
Else
 '削除ボタン全表示
 DataGrid1.Columns(4).Visible = True
End If


Session("ID") は何に使っているんでしょうか?
処理の内容にもよりますが、列の表示、非表示を切り替えるのは
DataBind の後にそのまま書いてしまってもいい気がします。

あと、他ではセルの表示、非表示を切り替えているわけで、
Columns(4).Visible で列の表示、非表示を切り替えても
消えたセルが表示されるわけではないですよ。

_________________
かるあ のメモスニペット
1

スキルアップ/キャリアアップ(JOB@IT)