@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

DataGridViewのカラムがどんどん増えていきます。

投稿者投稿内容
やよい
常連さん
会議室デビュー日: 2007/03/31
投稿数: 22
投稿日時: 2007-03-31 19:06
こんばんは。
質問させて下さい。
DataGridViewを継承したコントロールをフォームに貼り付けているのですが、
ビルドするたびに、カラムがどんどん増えていってしまいます。
長くなるのですが、
継承したコントロールでは、
Newメソッドで、

Me.Columns.Clear()
Me.AutoGenerateColumns = False
Me.AllowUserToAddRows = False
Me.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing

Me.AllowUserToOrderColumns = False
Me.MultiSelect = False

Me.ColumnHeadersHeight = CConst.CCELL_HEIGHT

Me.Font = New Font("MS ゴシック", 14, FontStyle.Regular, GraphicsUnit.Point)

Dim objColumn1 As New DataGridViewTextBoxColumn
Dim objColumn2 As New DataGridViewComboBoxColumn
Dim objColumn3 As New DataGridViewTextBoxColumn
Dim objColumn4 As New DataGridViewTextBoxColumn

Me.Columns.Add(objColumn1)
Me.Columns.Add(objColumn2)
Me.Columns.Add(objColumn3)
Me.Columns.Add(objColumn4)

For i As Integer = 0 To Me.Columns.Count - 1
 Me.Columns(i).SortMode = DataGridViewColumnSortMode.NotSortable
Next

With m_typeTable
 .Columns.Add(New DataColumn("選択種別", GetType(String)))
.Columns.Add(New DataColumn("選択種別コード", GetType(Integer)))
End With

Dim objRow1 As DataRow = m_typeTable.NewRow
Dim objRow2 As DataRow = m_typeTable.NewRow

objRow1.Item(0) = CConst.CTYPE_SINGLE
objRow1.Item(1) = 1
objRow2.Item(0) = CConst.CTYPE_MULTI
objRow2.Item(1) = 2

m_typeTable.Rows.Add(objRow1)
m_typeTable.Rows.Add(objRow2)

CType(objColumn2, DataGridViewComboBoxColumn).DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing

With objColumn2
 .DataSource = m_typeTable
.DisplayMember = "選択種別"
.ValueMember = "選択種別コード"
End With

objColumn1.HeaderText = "問番号"
objColumn1.HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter

objColumn1.CellTemplate.Style.Alignment =
DataGridViewContentAlignment.MiddleRight

objColumn1.Width = CConst.CCELL_WIDTH

objColumn2.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter

objColumn2.CellTemplate.Style.Alignment = DataGridViewContentAlignment.MiddleCenter

objColumn2.HeaderText = "選択種別"
objColumn2.Width = CConst.CCELL_WIDTH

objColumn3.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter

objColumn3.CellTemplate.Style.Alignment = DataGridViewContentAlignment.MiddleRight

objColumn3.HeaderText = "最小値"
objColumn3.Width = CConst.CCELL_WIDTH

objColumn4.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter

objColumn4.CellTemplate.Style.Alignment = DataGridViewContentAlignment.MiddleRight

objColumn4.HeaderText = "最大値"
objColumn4.Width = CConst.CCELL_WIDTH

のように、カラムを作成しています。
ビルドすると、このカラムが次々増えていってしまうのです。
たぶん、どこかに致命的なミスがあるのだと思うのですが、
私の知識では、わかりません。
どなたか、お知恵を下さい。
よろしくお願いします。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-03-31 19:35
引用:

やよいさんの書き込み (2007-03-31 19:06) より:

DataGridViewを継承したコントロールをフォームに貼り付けているのですが、
ビルドするたびに、カラムがどんどん増えていってしまいます。


「ビルドするたび」ではなく「デザイナで保存するたび」じゃないですか?

DataGridView を継承したコントロールの
コンストラクタで列を追加すると、
それを貼り付けたフォームを
デザイナで保存するたびに列が増えてしまいます。
これは私も経験済みですが、根本的な回避策は残念ながら知りません。
根本的ではない解決策としては、デザイナで保存する前に、
表示されている列を全て削除するという手があります。

根本的な解決策をご存知の方がいましたら、フォローお願いします。
やよい
常連さん
会議室デビュー日: 2007/03/31
投稿数: 22
投稿日時: 2007-03-31 19:57
ありがとうございます。
>「ビルドするたび」ではなく「デザイナで保存するたび」じゃないですか?
すみません。
よく確認していなかったのですが、保存するたびです。
>デザイナで保存する前に、
表示されている列を全て削除するという手があります。
確かに、削除した場合は、追加されていません。
なるべく注意しているのですが、
ついつい保存ボタンを押してしまって、
気が付いたら、カラムが何十個にもなってしまいます。
そうなってしまうと、プロパティの画面で消しても、
デザイナのコードにはしっかり残ってしまい、
それを消すのに苦労しています。
(間違って、必要なものまで消してしまいそうです・・・)
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-04-02 09:22
ユーザーコントロールのコンストラクタで、基本的な設定を行ってしまうという手もあるかと・・・

ただ、継承ではないので、必要なプロパティなどは自分で実装しなければなりませんけれど。
_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
やよい
常連さん
会議室デビュー日: 2007/03/31
投稿数: 22
投稿日時: 2007-04-05 18:51
こんばんは。
返答が遅くなってしまってすみません。
>継承ではないので、必要なプロパティなどは自分で実装しなければなりませんけれど。
私には・・・ハードルが凄く高いですね・・・。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-04-06 09:01
引用:

やよいさんの書き込み (2007-04-05 18:51) より:
こんばんは。
返答が遅くなってしまってすみません。
>継承ではないので、必要なプロパティなどは自分で実装しなければなりませんけれど。
私には・・・ハードルが凄く高いですね・・・。


そんなこと無いでしょう。
列のオブジェクトが決定されている状態の DataGridView を使いまわそうとしているのでしょうから、何らかの設定が必要なら、ユーザーコントロール内部でラッピングしたコントロールを直接触れば良いだけです。

_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-06 10:51
引用:

R・田中一郎さんの書き込み (2007-04-06 09:01) より:

列のオブジェクトが決定されている状態の DataGridView を使いまわそうとしているのでしょうから、何らかの設定が必要なら、ユーザーコントロール内部でラッピングしたコントロールを直接触れば良いだけです。


別のコンテナに乗せて、コンテナ側で初期化するだけで回避できるのですか。
結局、デザイナから 「コンストラクタ」 が実行されることを考えると再現しそうなのですが、
これで再現しないということであれば、明らかに IDE 上の不具合ですね。
検証できるのであれば、R・田中一郎さんの方でフィードバックしておいて頂けませんか?

--

本題の方ですが。

どうせコードで初期化するのだから、コンストラクタ以降の然るべきイベントに実装するか、
DesignMode を使用してトリッキーに回避するなどの方法を取った方が良いのではないかとも思います。
(デザイナで表示したいとなると、もうひと手間必要ですけど)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-04-06 14:50
引用:

じゃんぬねっとさんの書き込み (2007-04-06 10:51) より:
検証できるのであれば、R・田中一郎さんの方でフィードバックしておいて頂けませんか?



えええええええーーーーーーーーーーーーーーーーーーーーーーーーっ
ぶーぶーぶーぶーぶーぶーぶーぶー

コード:
class Class1 : DataGridView
{
  public Class1() {
    c1 = new DataGridViewTextBoxColumn();
    this.Columns.Add(c1);
  }
  private DataGridViewTextBoxColumn c1;
}

public partial class UserControl1 : UserControl
{
  public UserControl1() {
    InitializeComponent(); // ←ここに秘密が・・・・
    c1 = new DataGridViewTextBoxColumn();
    this.dataGridView1.Columns.Add(c1);
  }
  private DataGridViewTextBoxColumn c1;
}


上記2つのコントロールをフォームに貼り付けて、保存、閉じる、開くを繰り返すと、class1 のグリッドの列だけが増加することが確認できます。
_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog

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