- PR -

TableLayoutPanelのAdd処理

1
投稿者投稿内容
A.G.
会議室デビュー日: 2008/06/19
投稿数: 7
投稿日時: 2008-07-06 17:25
[VS2005 C# WindowsForm]
[WinXP SP2]
前回と同じコントロールの質問で恐縮ですが、お願いいたします。

現在、TableLayoutPanelにDatasetから1つずつボタンコントロールをAddして3×nの一覧表を作成しています。
そこで作成されたパネルに、別途用意したDataGridViewから項目を選択→ボタンでAddイベントを呼び出し、末尾にTableLayoutPanel.Controls.Add(btn)で追加を行っています。

次にパネルに配置されたボタンをクリック→GetPositionFromControlで座標を取得してcolumnとrowを指定。

TableLayoutPanel.Controls.Add(btn,1,1);

とすると、追加(挿入)処理を行っていない箇所に対してのAddはいいのですが
既に挿入された箇所を指定してAddを呼ぶとおかしな行に挿入されてしまいます。

[初期] [挿入1] [挿入2]
@AB @■■ @■■
CDE ■■A ☆■■
FGH BCD ABC

(1,0)から(1,1)へかけてAdd処理を4回行い、2つ目の図の状態にしたあと
(0,1)に対しAdd(☆)を行うと3つ目の図のようになります。

ところがここで(1,1)に対しAdd(△)を行うと下記のような状態になりました。

[挿入3]
@■■
☆■△
■AB

ステップ実行で確認してみた所、☆を挿入する時点で、☆とその右隣の座標が同じものが取れているみたいなのです。
処理が終わったあとにボタンをクリックするときちんと(0,1)、(1,1)という座標が取れるものの、ボタンに持たせたNameプロパティの値は両方とも☆と同じものが入っており、☆とその右隣のものを同じもの(?)と見ているためなのか、本来△が挿入されるべき位置を無視して(2,1)に挿入されてしまっているような感じなのです。
証拠に☆をRemoveすると(1,1)の■を飛び越えて、(0,1)に△が移動してきます。
自分なりにヘルプも読んでみたのですが、挿入するには単純にAddすればいいとしか見つけれませんでしたので、お知恵を拝借させて頂けませんでしょうか。
カドルドエグ
常連さん
会議室デビュー日: 2008/05/29
投稿数: 25
投稿日時: 2008-07-10 11:49
複雑でいまいち状況が上手くつかめないのですが、まとめると下記のような状況でしょうか?

・TableLayputPanelにデータバインドを行っている
・DataSetはTableLayputPanelとDataGridBView共有(テーブルも同じ?)
・TableLayputPanelへのAdd対象がDataGridView上のDataGridViewButtonCellに該当する項目と同じ
・Addのタイミングは二回:DataGridView上のボタン / パネル上のボタン
※「座標を取得してcolumnとrowを指定」ということはダイアログか何かが出るのでしょうか?

A.G.
会議室デビュー日: 2008/06/19
投稿数: 7
投稿日時: 2008-07-12 14:24
分かり辛い文章ですみません。

・TableLayputPanelにデータバインドを行っている
→いえ、TableLayoutPanelにLoad時にFillしてきたデータをfor文で追加する処理を行っているだけでバインドはしていません。

・DataSetはTableLayputPanelとDataGridBView共有(テーブルも同じ?)
→上記の通りPanelはただ配置してるだけですのでDataGridViewとは共有ではありません。

・TableLayputPanelへのAdd対象がDataGridView上のDataGridViewButtonCellに該当する項目と同じ
→これはそうです。
 実際にはGridViewのCellを選択し、Cellクリックイベントで挿入するデータを取得、
 別途容易したボタン(Grid上のボタンではない)で、挿入するボタンの名称に取得したデータを割り当てて処理を行っています。

・Addのタイミングは二回:DataGridView上のボタン / パネル上のボタン
→Addのタイミング、というよりAddを行えるボタンが1つしかないので1回しかないはずです。
 (意図された回答でなかったらすみません)

※「座標を取得してcolumnとrowを指定」ということはダイアログか何かが出るのでしょうか?
→上記のGridViewCell選択の前に、パネル上に配置したボタンをクリックして「そのボタンの場所に挿入しますよ」ということを色を変えて視覚的に見せた後、挿入ボタンで挿入処理を行う流れになっています。
 ですので、座標を取得するのはボタンクリックイベントで内部的に取得しているだけでダイアログ等が表示されるわけではありません。

1

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