- PR -

行のクリア

投稿者投稿内容
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2007-10-10 16:50
前回は お世話になりました。

VB2005にて、初めて入力処理のプログラムを作成しています。

明細部の入力にTableLayoutPanelを配置(6行X4列)し
そのセルにPanelを配置(その上にTextBoxを配置)したり直接TextBox、ComboBoxを配置した
レイアウトになっています。

そこでファンクションキーのF4を押した場合、上段の内容を押した行に複写、
またF6を押した場合、押した行の内容をクリア(TextBoxはTextプロパティ、ComboBoxはSelectedIndexを0にする)
する機能を追加したいのです。

vSen = Microsoft.VisualBasic.Right(Trim(sender.Name), 1)  '現在行

Select Case e.KeyCode
Case Keys.F4
'*** 複写 ***
Int16.TryParse(vSen, vSUJI)
vSen2 = (vSUJI - 1).ToString   '前行
vPnl2 = DirectCast(pnlLine.Controls("pnlSYCD" & vSen2), Panel)
vPnl.Controls("SY11" & vSen).Text = vPnl2.Controls("SY11" & vSen2).Text
vPnl.Controls("SY12" & vSen).Text = vPnl2.Controls("SY12" & vSen2).Text
vPnl.Controls("SY2" & vSen).Text = vPnl2.Controls("SY2" & vSen2).Text
vComboBox2 = DirectCast(pnlLine.Controls("pnlHINME" & vSen2).Controls ("HINME" & vSen2), ComboBox)
vComboBox.SelectedIndex = vComboBox2.SelectedIndex
pnlLine.Controls("SUR" & vSen).Text = pnlLine.Controls("SUR" & vSen2).Text
pnlLine.Controls("TANK" & vSen).Text = pnlLine.Controls("TANK" & vSen2).Text

Case Keys.F6
'*** クリア ***
vPnl.Controls("SY11" & vSen).Text = ""
vPnl.Controls("SY12" & vSen).Text = ""
vPnl.Controls("SY2" & vSen).Text = ""
vComboBox.SelectedIndex = 0
pnlLine.Controls("SUR" & vSen).Text = ""
pnlLine.Controls("TANK" & vSen).Text = ""
End Select

と、コーディングしましたが、もっとシンプルなコーディング方法はないでしょうか?

例えばTableLayoutPanelの何かを使って・・

どなたか、ご教授頂けないないでしょうか。

宜しくお願いします。



よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-10-10 21:10
何かといえば GetControlFromPosition など。
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2007-10-11 14:18
 ありがとうございます。

試しに2行、3列のTableLayoutPanelに
ボタン、テキストボックス2つを配置し
ボタンをクリックしたらその行の内容を
クリアするテストを行いたいのですが

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button0.Click, Button1.Click

For Each c As Control In TableLayoutPanel.Controls
Debug.Print(TableLayoutPanel.GetRow(c).ToString)
Next

End Sub

指定した行全てなので、メソッドをGetRowにしてみました。

ここから、どのように指定した行をクリアするのでしょうか?

よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-10-11 16:08
For Each にて何を取得したいのかがわかりませんが・・・。


TableLayoutPanel.GetRow([押されたボタン])
でボタンがどの行にあるのかを取得する。

TableLayoutPanel.GetControlFromPosition([column],[取得した行])
でColumn数の分だけループさせてTextBoxなら値をクリアする。
(ComboBoxなどが混ざる場合は場合分けすればよいと思われます)
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2007-10-11 18:30
よっし〜さん、ありがとうございます。

クリアはよく解りました。

上段複写は、押された位置とその上段の位置が必要ですよね。

申し訳ありません、
上段複写となると、どのようにループさせると効率的でしょうか?
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-10-12 13:04
[押された位置]-1 が上段の行になるのではないでしょうか。
最上段での制御は必要ですが。

TableLayoutPanel.GetControlFromPosition([column],[取得した行])

TableLayoutPanel.GetControlFromPosition([column],[取得した行]-1)
の値をセットするでよいと思います。

なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2007-10-12 14:11
よっし〜さん、何度もありがとうございました。
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 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のコピーができません、
このような場合、どのようにして子コントロールどうしを複写できますでしょうか?

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