C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 同じような処理を共通化したい


(過去ログ 130 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■77117 / inTopicNo.1)  同じような処理を共通化したい
  
□投稿者/ まあさ (7回)-(2015/09/15(Tue) 11:36:48)

分類:[VB.NET/VB2005 以降] 

以下のような似たようなチェックボックスの処理を、一つにまとめたいのですがうまくいきません

Private Sub chkA_CheckedChanged(sender As Object, e As EventArgs) Handles chkA.CheckedChanged
If Me.chkA.Checked Then
Me.pnlA.Enabled = True
Else
Me.pnlA.Enabled = False
End If
End Sub

Private Sub chkB_CheckedChanged(sender As Object, e As EventArgs) Handles chkB.CheckedChanged
If Me.chkB.Checked Then
Me.pnlB.Enabled = True
Else
Me.pnlB.Enabled = False
End If
End Sub

Private Sub chkC_CheckedChanged(sender As Object, e As EventArgs) Handles chkC.CheckedChanged
If Me.chkC.Checked Then
Me.pnlC.Enabled = True
Else
Me.pnlC.Enabled = False
End If
End Sub


上記の処理を下記の様にしたい
Private Sub chkC_CheckedChanged(sender As Object, e As EventArgs) Handles chkA.CheckedChanged, _
chkB.CheckedChanged, _
chkC.CheckedChanged
:
ここの処理の書き方が解りません
:
End Sub


どのように実装すればよろしいのでしょうか?
お解りの方よろしくお願いします。


Verは、2012です



引用返信 編集キー/
■77118 / inTopicNo.2)  Re[1]: 同じような処理を共通化したい
□投稿者/ 魔界の仮面弁士 (492回)-(2015/09/15(Tue) 11:57:16)
No77117 (まあさ さん) に返信
> ここの処理の書き方が解りません

chkA では pnlA を
chkB では pnlB を
chkC では pnlC を操作したいのですよね。


chk* は CheckBox だとして、
pnl* は Panel でしょうか? とりあえず Control 継承クラスと仮定して回答します。


' (案1) 各CheckBox の Tag プロパティに、操作対象のオブジェクトをセットしておく

Public Class Form1

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    chkA.Tag = pnlA
    chkB.Tag = pnlB
    chkC.Tag = pnlC
  End Sub

  Private Sub CheckBoxes_CheckedChanged(sender As Object, e As EventArgs) _
    Handles chkA.CheckedChanged, chkB.CheckedChanged, chkC.CheckedChanged

    Dim chk = DirectCast(sender, CheckBox)
    Dim pnl = TryCast(chk.Tag, Control)
    If pnl IsNot Nothing Then
      pnl.Enabled = chk.Checked
    End If
  End Sub

End Class



' (案2) CheckBox と、操作対象のオブジェクトの組み合わせを管理するコレクションを用意

Public Class Form1
  Private dicChkPnl As New Dictionary(Of CheckBox, Control)()

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    '最初に、chk と pnl の組み合わせを登録しておく
    dicChkPnl.Add(chkA, pnlA)
    dicChkPnl.Add(chkB, pnlB)
    dicChkPnl.Add(chkC, pnlC)

    'Checked に連動するよう、イベントを動的割当
    For Each entry In dicChkPnl
      Dim chk = entry.Key
      Dim pnl = entry.Value
      AddHandler entry.Key.CheckedChanged, Sub() pnl.Enabled = chk.Checked
      If pnl.Enabled <> chk.Checked Then pnl.Enabled = chk.Checked
    Next
  End Sub
End Class



' (案3) コントロールの名前を通じて捜索 ※若干低速です

Public Class Form1
  Private Sub CheckBoxes_CheckedChanged(sender As Object, e As EventArgs) _
   Handles chkA.CheckedChanged, chkB.CheckedChanged, chkC.CheckedChanged

    Dim chk = DirectCast(sender, CheckBox)
    Dim sName As String = "pnl" & chk.Name.Substring(3)
    Me.Controls.Find(sName, True).First().Enabled = chk.Checked
  End Sub
End Class
引用返信 編集キー/
■77120 / inTopicNo.3)  Re[1]: 同じような処理を共通化したい
□投稿者/ shu (780回)-(2015/09/15(Tue) 12:54:28)
No77117 (まあさ さん) に返信

制御用クラスを作成する方法

Public Class Form1
    Private Class CtlCheckPanel
        Private WithEvents _Chk As CheckBox
        Private _Pnl As Panel

        Public Sub New(Chk As CheckBox, Pnl As Panel)
            _Chk = Chk
            _Pnl = Pnl
        End Sub

        Private Sub _Chk_CheckedChanged(sender As Object, e As System.EventArgs) Handles _Chk.CheckedChanged
            _Pnl.Enabled = _Chk.Checked
        End Sub
    End Class

    Private _CtlList As List(Of CtlCheckPanel)

    Public Sub New()
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        _CtlList = New List(Of CtlCheckPanel)
        _CtlList.Add(New CtlCheckPanel(CheckBox1, Panel1))
        _CtlList.Add(New CtlCheckPanel(CheckBox2, Panel2))
        _CtlList.Add(New CtlCheckPanel(CheckBox3, Panel3))
    End Sub

End Class

引用返信 編集キー/
■77121 / inTopicNo.4)  Re[2]: 同じような処理を共通化したい
□投稿者/ shu (781回)-(2015/09/15(Tue) 12:58:50)
No77120 (shu さん) に返信

ラムダ式を使う方法

Public Class Form1
    Public Sub New()
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        AddHandler CheckBox1.CheckedChanged, Sub(s, e) CheckChg(CheckBox1, Panel1)
        AddHandler CheckBox2.CheckedChanged, Sub(s, e) CheckChg(CheckBox2, Panel2)
        AddHandler CheckBox3.CheckedChanged, Sub(s, e) CheckChg(CheckBox3, Panel3)
    End Sub

    Private Sub CheckChg(Chk As CheckBox, Pnl As Panel)
        Pnl.Enabled = Chk.Checked
    End Sub

End Class

引用返信 編集キー/
■77122 / inTopicNo.5)  Re[1]: 同じような処理を共通化したい
□投稿者/ 魔界の仮面弁士 (493回)-(2015/09/15(Tue) 13:28:09)
No77117 (まあさ さん) に返信
> 以下のような似たようなチェックボックスの処理を、一つにまとめたいのですがうまくいきません

これだけでも良いかな。


Public Class Form1
 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  CheckBox1.DataBindings.Add("Checked", Panel1, "Enabled", False, DataSourceUpdateMode.OnPropertyChanged)
  CheckBox2.DataBindings.Add("Checked", Panel2, "Enabled", False, DataSourceUpdateMode.OnPropertyChanged)
  CheckBox3.DataBindings.Add("Checked", Panel3, "Enabled", False, DataSourceUpdateMode.OnPropertyChanged)
 End Sub
End Class



引用返信 編集キー/
■77123 / inTopicNo.6)  Re[2]: 同じような処理を共通化したい
□投稿者/ 魔界の仮面弁士 (494回)-(2015/09/15(Tue) 13:40:22)
No77122 (魔界の仮面弁士) に追記
>>以下のような似たようなチェックボックスの処理を、一つにまとめたいのですがうまくいきません
> これだけでも良いかな。

こういう形にもできます。

Panel1.DataBindings.Add("Enabled", CheckBox1, "Checked", False, DataSourceUpdateMode.OnPropertyChanged)
Panel2.DataBindings.Add("Enabled", CheckBox2, "Checked", False, DataSourceUpdateMode.OnPropertyChanged)
Panel3.DataBindings.Add("Enabled", CheckBox3, "Checked", False, DataSourceUpdateMode.OnPropertyChanged)
引用返信 編集キー/
■77139 / inTopicNo.7)  Re[3]: 同じような処理を共通化したい
□投稿者/ まあさ (8回)-(2015/09/16(Wed) 15:11:15)
魔界の仮面弁士さん、shuさん に返信

魔界の仮面弁士さん、shuさん 言葉足らずの問合せにもかかわらず、
対応していただきありがとうございます。

無事解決しました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -