- PR -

DataGridViewの列の非表示について

投稿者投稿内容
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-19 22:21
> 1.DataGridViewと閉じるボタンのForm3を追加してForm2から呼び出す。
この時の Form2 とは最初の説明の Form2 でしょうか?
つまり
Form1(起動ボタン)--> Form2(テーブル表示&起動ボタン)--> Form3(テーブル表示)
と言う事でしょうか。
同様のプログラムを作ってみましたが再現しません。
もしかすると Form_Load の度に DataGridView にデータを表示しているけど
最初に初期化していないから呼び出す度にデータが重複して追加されており、
それが原因になっているとか・・・(考えすぎでしょうか)

> そもそもFormのインスタンスを作成する必要があることすら知らなかった(自動で作成してくれるものと思っていた)ので、本来は明示的に作成する必要があることがわかりすっきりしたと云うことです。

本来は
「暗黙のインスタンス生成の Form を2回 ShowDialog で呼び出すと
 最初の列の Visible が強制的に True になってしまう」
という問題ですよね?
それを明示的に Form を生成したら「なんかしらないけど」解決し、
かつ「明示的に作成した方が良い」と言われたから納得した訳ですよね?
と言う事は本来の質問の解決ではない様な気がします。

私は暗黙だろうが明示的だろうがどっちでも良いと思います。
だってどちらも方法が用意されてるんですし。
だからこの様な解決は「逃げ」の様に感じてしまうわけです。

と偉そうな事言いましたけど、私にはもうお手上げっぽいですけどね(笑)
Haru
常連さん
会議室デビュー日: 2009/02/18
投稿数: 37
投稿日時: 2009-02-20 01:51
引用:

Kingさんの書き込み (2009-02-19 22:21) より:
> 1.DataGridViewと閉じるボタンのForm3を追加してForm2から呼び出す。
この時の Form2 とは最初の説明の Form2 でしょうか?
つまり
Form1(起動ボタン)--> Form2(テーブル表示&起動ボタン)--> Form3(テーブル表示)
と言う事でしょうか。



はい、その通りです。

引用:

同様のプログラムを作ってみましたが再現しません。
もしかすると Form_Load の度に DataGridView にデータを表示しているけど
最初に初期化していないから呼び出す度にデータが重複して追加されており、
それが原因になっているとか・・・(考えすぎでしょうか)



んー、再現しませんか。。。
違うPCでも試しましたが、発生するプロジェクトではどのPCでも再現しますので
私の環境特有の問題ではないと思います。
作り方があるのでしょうね...

実際に記述したコードはForm2.ShowDialog()とForm3.ShowDialog()の2行だけで
あとはデザイナーでカチカチやってるだけなんですが(笑)

引用:

本来は
「暗黙のインスタンス生成の Form を2回 ShowDialog で呼び出すと
 最初の列の Visible が強制的に True になってしまう」
という問題ですよね?
それを明示的に Form を生成したら「なんかしらないけど」解決し、
かつ「明示的に作成した方が良い」と言われたから納得した訳ですよね?
と言う事は本来の質問の解決ではない様な気がします。

私は暗黙だろうが明示的だろうがどっちでも良いと思います。
だってどちらも方法が用意されてるんですし。
だからこの様な解決は「逃げ」の様に感じてしまうわけです。

と偉そうな事言いましたけど、私にはもうお手上げっぽいですけどね(笑)



私は明示的にインスタンスを生成することで初期化のタイミングを
コントロールできるので問題ないと考えました。

確信はありませんが、2回目以降の表示でVisible がTrueに変わってしまうのは
VBのバグではないかと思っています。
インスタンスの削除が中途半端な状態で再利用されてしまっているために
先頭項目のVisibleがTrueに変わってしまっているように見えるからです。
もし2回目以降の表示をする時にも表示項目の初期化を行っているのであれば
2番目以降の項目も表示されるはずですが、なぜか先頭項目のVisibleしか
変更されません。
うまく表現できませんが、初期化が中途半端というよりはゴミが残っているような
感じがします。


Haru
常連さん
会議室デビュー日: 2009/02/18
投稿数: 37
投稿日時: 2009-02-20 16:14
http://haru20090220.web.fc2.com/
アプリのソース一式を置きました。
宜しければご覧下さい。

[ メッセージ編集済み 編集者: Haru 編集日時 2009-02-20 16:25 ]
108
常連さん
会議室デビュー日: 2007/12/12
投稿数: 45
投稿日時: 2009-02-20 18:57
提示のソースで再現しますね。

詳細に解析していませんが、
こういう作り方はしたことがありませんので不思議です。

Form2にはOKボタン、Form3にはButton1が配置されています。
双方ともクリックイベントがありません。
フォームのCloseイベントもありません。
押すとそれぞれ閉じます。なんで?誰か教えてください。

フォームを閉じる処理がひとつもないです。
インスタンスの破棄も余裕でありません。

Form3.ShowDialogでは2回目以降
ColumnAddedイベントは走りませんね。

まぁ上記はおいといて、Haruさんの方法で、
DataGridViewの全ての列のVisible = Falseにしてみて下さい。
1行目が表示されますね。
バインドするデータがない場合などは、グリッドに何も表示されないことは
ありますが、明示的に全ての列を非表示にはできないのでしょうか。

上記が関連しているとは何の確信もありませんが、とりあえず報告。



Haru
常連さん
会議室デビュー日: 2009/02/18
投稿数: 37
投稿日時: 2009-02-20 19:15
引用:

108さんの書き込み (2009-02-20 18:57) より:
提示のソースで再現しますね。

詳細に解析していませんが、
こういう作り方はしたことがありませんので不思議です。

Form2にはOKボタン、Form3にはButton1が配置されています。
双方ともクリックイベントがありません。
フォームのCloseイベントもありません。
押すとそれぞれ閉じます。なんで?誰か教えてください。

フォームを閉じる処理がひとつもないです。
インスタンスの破棄も余裕でありません。



お試し頂きありがとうございます。
Upするつもりは無かったので適当に作ったソースをそのまま提示してしまいました。

Form3のButton1は閉じるボタンです。(多分お分かり頂けたとは思いますが・・・)

ボタンを押してフォームが閉じるのはボタンのDialogResultにOKとかCancelを指定しているからです。
もしかして、この作り方がいけないのでしょうか???
私はShowDialogで開いたフォームを閉じるのはてっきりこの作り方が標準なのかと思っていました。


引用:

Form3.ShowDialogでは2回目以降
ColumnAddedイベントは走りませんね。



カラムの追加はインスタンスが作成された時に終わっているからではないでしょうか?


引用:

まぁ上記はおいといて、Haruさんの方法で、
DataGridViewの全ての列のVisible = Falseにしてみて下さい。
1行目が表示されますね。
バインドするデータがない場合などは、グリッドに何も表示されないことは
ありますが、明示的に全ての列を非表示にはできないのでしょうか。

上記が関連しているとは何の確信もありませんが、とりあえず報告。



私も試して見ましたが、すべてのカラムを非表示にした時には先頭カラムが表示されますね。
なんとなく関連があるような気がします。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2009-02-20 21:18
試してないけど、DataGridViewColumnを継承したクラスでVisibleが変わる瞬間がわかるじゃないかな。

コード:
public class MyDataGridViewColumn : DataGridViewColumn
{
	public override bool Visible
	{
		set
		{
			System.Diagnostics.Trace.Fail(this.Name + ".Visible=" + value);
			base.Visible = value;
		}
	}
}

108
常連さん
会議室デビュー日: 2007/12/12
投稿数: 45
投稿日時: 2009-02-20 21:35
引用:
ボタンを押してフォームが閉じるのはボタンのDialogResultにOKとかCancelを指定しているからです。



ですね。お恥ずかしい。
Designerは見ていませんでした・・・
失礼しました。

引用:
Form3.ShowDialogでは2回目以降
ColumnAddedイベントは走りませんね。



これはその後の記述に関連しているかなと思い記述しました。
皆がソースをダウンロードして確認するとは思わなかったので、
端的に状況を表せるかなと。
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-21 05:17
なんだかハッキリとはつかめていないのですが


列1の表示が変更されるタイミングとしては、
3つ目のフォームを2回目に開けたForm_Loadで、TableAdapterのFillメソッドを呼んだ時です。
(Fillの前ではDataGridView1.Columns(0).Visible はFalse、後ではTrueに変化)

※ Formの数は関係ありません。
※ 親のフォームがデータグリッドビューを持っている必要もありません。

条件としては
1) 子フォームは呼びだし元のフォームから、インスタンスを作成せずに 子フォームクラスのShowDialog()メソッドを呼び出します。
(後述しますが、自分でインスタンス作成しても起こりました。)

2) 子フォームのForm_LoadでTableAdapter.FillをDataGridViewにバインドしている
DataTableに対して行います。

このような作りになっていると、
2度目の呼びだし時に列1が表示されてしまうようです。


※ Form_Loadではなく別途ボタンを設けて、そこでFillする分には閉じて二回目開けても列1が表示されることはありませんでした。
※ 二回目のForm3.Form_LoadでMe.テーブル2TableAdapter.Fill(Me.ViewtestDataSet6.テーブル2)をスキップさせると事象は発生しませんでした。また、データもバインドされたままでした。


ちょっと上手く説明できてませんが、上記のような挙動になっているようです。

# 内部動作を考えてみたものの、「左端の列だけ」復活するっていうのは説明がつかない気がします。

# 初回のForm3.ShowDialog()で作成されたインスタンスが二回目のForm3.ShowDialog()で使われてるんでしょうが。



以下の場合、自分でインスタンス作成しても起こりました。

Dim frm3 as Form3 = Nothing

Private Sub Button1_Click(...)
IF frm3 Is Nothing Then
frm3 = new Form3()
End IF

frm3.ShowDialog()

End Sub

インスタンス使いまわしつつ、Form_LoadでFillしてると起きる・・・のかな。



[ メッセージ編集済み 編集者: デューン 編集日時 2009-02-21 05:24 ]

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