- PR -

行のクリア

投稿者投稿内容
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-10-13 14:31
引用:

なびさんの書き込み (2007-10-12 15:50) より:
先程はありがとうございました。

For i = 0 To pnlLine.ColumnCount - 1
pnlLine.GetControlFromPosition(i, 位置).Text = pnlLine.GetControlFromPosition(i, 位置-1).Text
Next

としましたが、もう1つ下位レベルのPanelに貼り付けてあるTextBoxのコピーができません、
このような場合、どのようにして子コントロールどうしを複写できますでしょうか?


pnlLine.GetControlFromPosition(i, 位置).Text としているため発想がしづらいと思われます。

[パネル上にあるのがテキストボックスの場合]
Dim txtA , txtB As TextBox
txtA = DirectCast(pnlLine.GetControlFromPosition(i, 位置),TextBox)
txtB = DirectCast(pnlLine.GetControlFromPosition(i, 位置-1),TextBox)
txtA.Text = txtB.Text 

上記を応用して、TextBoxをTableLayoutPanel に置き換えて考えればできると思います。


「オブジェクト」を扱うようにしてください。

なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2007-10-15 19:25
こんばんは。

DirectCastを参考に

For i = 0 To pnlLine.ColumnCount - 1
sCopyControl(pnlLine.GetControlFromPosition(i, 選択位置 + 1), 選択位置)
Next
'**********
Private Sub sCopyControl(ByVal pControl As Control, ByVal pSen As String)
Dim vTextBox As TextBox
Dim vComboBox As ComboBox
'***
Select Case True
Case TypeOf pControl Is TextBoxBase
'*** TextBox ***
vTextBox = DirectCast(pnlLine.Controls(pControl.Name.Substring(0, pControl.Name.Length - 1) & pSen), TextBox)
pControl.Text = vTextBox.Text
Case TypeOf pControl Is ComboBox
'*** ComboBox ***

End Select
'***
If pControl.HasChildren = True Then
For Each cldControl As Control In pControl.Controls
sCopyControl(cldControl, pSen)
Next
End If
End Sub

と再帰的に呼び出すようにもしましたが
pControl.Text = vTextBox.Textのところで
オブジェクト参照がオブジェクト インスタンスに設定されていませんの
エラーになってしまいます。

sCopyControlのプロシージャでコピーする
コントロールの名前の右端1文字を変えて
(TEXT11 なら TEXT12 )

コピー元の値をとるのがシンプルかと
思いまして上記のようなコーディングをしました・・

txtA.Text = txtB.Text  とありますが
両方、Panelの中にPanelがあるため再帰的呼び出しを
考慮しなくてはいけないと思いますが

ご教授頂けないでしょうか?



なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2007-10-15 19:32
すいません、書き漏れです。

vTextBox = DirectCast(pnlLine.Controls(pControl.Name.Substring(0, pControl.Name.Length - 1) & pSen), TextBox)

とありますが、pnlLine.Controlsの各列は
直接TextBoxを配置している列や、Panelを置き、その上にTextBoxを配置している列も
あるため上記の書き方ではまず駄目なのです。

うーむ、どうしたらコピーもと、コピー先の両方を
再帰的にしょりできるのでしょうか。

よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-10-15 21:52
引用:

なびさんの書き込み (2007-10-15 19:25) より:
txtA.Text = txtB.Text  とありますが
両方、Panelの中にPanelがあるため再帰的呼び出しを
考慮しなくてはいけないと思いますが



なにもそのまま使えというわけではなくTextBoxをTableLayoutPanelに置き換えて考えてみてください。
パネルのなかにパネルがあるので「再帰的に」と考えるのもありかもしれませんが
「再帰」を使うほどのものでもないと思います。

テキストボックスの最後の1文字で判断する手法も可能ですが
コピー元のパネル内のテキストボックスの位置と
コピー先のパネル内のテキストボックスの位置は同一であるはず(おそらく)

上記理論から

私のとっている方法は
複写元のパネルを取得
Dim tlp複写元 As TableLayoutPanel = 上位パネル.GetControlFromPosition(0,[複写元])
複写先のパネルを取得
Dim tlp複写先 As TableLayoutPanel = 上位パネル.GetControlFromPosition(0,[複写先])

複写元のテキストボックス
Dim txtA As TextBox = tlp複写元.GetControlFromPosition([column],[row])
複写先のテキストボックス
Dim txtB As TextBox = tlp複写先.GetControlFromPosition([column],[row])

#あ、DirectCast忘れた…

txtA.Text = txtB.Text

としたほうがわかりやすいかと思います。あくまで私の主観ですが。
こうすればTextBoxに規則性をもたせる必要もなく、何行あっても関係なく処理できるのでは。
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2007-10-16 13:36
よっし〜さん、たびたび申し訳ありません。

まず
Dim pnlA As TableLayoutPanel = DirectCast(pnlLine.GetControlFromPosition(0, vSUJI), TableLayoutPanel)
Dim pnlB As TableLayoutPanel = DirectCast(pnlLine.GetControlFromPosition(0, vSUJI + 1), TableLayoutPanel)
For i = 0 To pnlLine.ColumnCount - 1
Dim txtA As TextBox = DirectCast(pnlA.GetControlFromPosition(i, vSUJI), TextBox)
Dim txtB As TextBox = DirectCast(pnlB.GetControlFromPosition(i, vSUJI + 1), TextBox)
     txtB.Text = txtA.Text
Next

とコーディングしてみました。

すると1行目で
「型 'System.Windows.Forms.Label' のオブジェクトを型 'System.Windows.Forms.TableLayoutPanel' にキャストできません。」
のエラーになります。

改めて環境ですが、TableLayoutPanel(7行X6列)があります。
1行目はLabelを配置し列の見出しにしています。
また1列目もLabelを配置し行の番号(1から6)にしています。

2列目はPanelを置きTextBox を3つ配置し、3列目はComboBox、4,5,6列目はTextBoxを直接配置してあります。

各行のレイアウトは同じです。

次に行いたいことは、F4を2列目で押した時
上段の1行の内容を複写(行番号は除く)したいのです。

そのため
For i = 0 To pnlLine.ColumnCount - 1

Next

でLOOPさせる必要があるのと、各列で階層が違う為
再帰的呼び出しの必要があるかと思うのですが・・・

今少しお力添え頂けませんか

宜しくお願いします。
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-10-17 14:09
引用:

なびさんの書き込み (2007-10-16 13:36) より:

すると1行目で
「型 'System.Windows.Forms.Label' のオブジェクトを型 'System.Windows.Forms.TableLayoutPanel' にキャストできません。」
のエラーになります。

改めて環境ですが、TableLayoutPanel(7行X6列)があります。
1行目はLabelを配置し列の見出しにしています。
また1列目もLabelを配置し行の番号(1から6)にしています。

2列目はPanelを置きTextBox を3つ配置し、3列目はComboBox、4,5,6列目はTextBoxを直接配置してあります。

各行のレイアウトは同じです。




TableLayoutPanel が入れ子になっているのは2列目だけなのですから
TableLayoutPanel にキャストできるはずがありません。

しかも1列目はコピー対象外でよいのでは?

コード:
For i = 1 To pnlLine.ColumnCount - 1 
 Select Case i
   case 1
     'ここはTableLayoutPanelにキャスト
   case 2
     'ComboBox
   case 3,4,5
     'TextBox
   case else
Next 

なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2007-10-17 19:19
何度もありがとうございます。

2列目はTableLayoutPanelでなく
Panelを置きTextBox を3つ配置しています。

となると
Dim pnlA As TableLayoutPanel = DirectCast(pnlLine.GetControlFromPosition(0, vSUJI), TableLayoutPanel) はできません。

TableLayoutPanelは入れ子をしないようにとMSDNにあったのですが
やはりTableLayoutPanelにしないとダメでしょうか?


よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-10-17 20:49
TableLayoutPanelではなくPanelだったのですね。
失礼しました。

引用:

Panelを置きTextBox を3つ配置しています。



これの意図を知りたいですね。
TableLayoutPanelに3列追加するわけにはいかなかったのでしょうか?

Panel内のコントロールをうまく取得する方法は残念ですが存じあげません。

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