- - PR -
行のクリア
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-10-13 14:31
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-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-10-15 19:32
すいません、書き漏れです。
vTextBox = DirectCast(pnlLine.Controls(pControl.Name.Substring(0, pControl.Name.Length - 1) & pSen), TextBox) とありますが、pnlLine.Controlsの各列は 直接TextBoxを配置している列や、Panelを置き、その上にTextBoxを配置している列も あるため上記の書き方ではまず駄目なのです。 うーむ、どうしたらコピーもと、コピー先の両方を 再帰的にしょりできるのでしょうか。 | ||||||||
|
投稿日時: 2007-10-15 21:52
なにもそのまま使えというわけではなく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-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-10-17 14:09
TableLayoutPanel が入れ子になっているのは2列目だけなのですから TableLayoutPanel にキャストできるはずがありません。 しかも1列目はコピー対象外でよいのでは?
| ||||||||
|
投稿日時: 2007-10-17 19:19
何度もありがとうございます。
2列目はTableLayoutPanelでなく Panelを置きTextBox を3つ配置しています。 となると Dim pnlA As TableLayoutPanel = DirectCast(pnlLine.GetControlFromPosition(0, vSUJI), TableLayoutPanel) はできません。 TableLayoutPanelは入れ子をしないようにとMSDNにあったのですが やはりTableLayoutPanelにしないとダメでしょうか? | ||||||||
|
投稿日時: 2007-10-17 20:49
TableLayoutPanelではなくPanelだったのですね。
失礼しました。
これの意図を知りたいですね。 TableLayoutPanelに3列追加するわけにはいかなかったのでしょうか? Panel内のコントロールをうまく取得する方法は残念ですが存じあげません。 |