DOBON.NET DOBON.NETプログラミング掲示板過去ログ

別クラスのイベントを捕捉したい

環境/言語:[Windos2000SP4 VB.NET2003 Frame1.1]
分類:[.NET]

VB.NETの初心者です。宜しくお願いします。
.NET TipsのDataGridコントロール(System.Windows.Forms)編メニューの中のDataGridでComboBoxを使う。を使用したとき、ComboBoxのテキストがChangeされた時にメインのクラスでイベントを捕捉したい。
以下のように記述しましたがうまくイベントを取ることが出来ません。

Class Main
Private WithEvents mText As Dobon.Samples.Forms.DataGridComboBoxColumn

Main_Load()
Dim comboSorce = New DataTable
Dim mText As New CAQE.Dobon.Samples.Forms.DataGridComboBoxColumn(comboSorce.DefaultView, "DisplayMember", "ValueMember")
AddHandler mText.ChangeText, AddressOf mTextChanged
-----
end sub

sub mTextChanged
* -> ここでComoBoxのイベントによる処理をしたい。
end sub


以下は例題の部分に追加部分のみを記入しました。
------------------
Namespace Dobon.Samples.Forms
Public Class DataGridComboBoxColumn
Private _comboBox As DataGridComboBox
Public Event ChangeText()
--
Public Sub New------
AddHandler _comboBox.SelectedValueChanged, AddressOf _comboBox_TextChanged


Private Sub _comboBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs)
_editing = True
RaiseEvent ChangeText()
End Sub
End Namespace
ご質問の意味を理解しきれていない部分があることをお許しください。

DataGridComboBoxColumnクラスを改造するのではなく、DataGridComboBoxColumnクラスのComboBoxプロパティを使ってみてください。
■No11403に返信(管理人さんの記事)
> ご質問の意味を理解しきれていない部分があることをお許しください。
>
> DataGridComboBoxColumnクラスを改造するのではなく、DataGridComboBoxColumnクラスのComboBoxプロパティを使ってみてください。
御検討有難う御座いました。初心者なので質問がうまく出来ませんでした。すいませんでした。
最終目標:DataGrid内のコンボボックスのSelectedValueChangedイベントを捕捉してラベルを変更する。

御指摘のクラス改造ではなく、クラスのComboBoxイベントをAddHandlerで設定しましたがうまくいきませんでした。クラスからのイベントがうまく取れない現象は同じです。

下記にコードを添付します。宜しく御指導のほどお願いします。

Imports System
Imports System.Data
Imports System.Windows.Forms
Imports System.Drawing
Public Class Form1
Inherits System.Windows.Forms.Form
Public WithEvents mText As Dobon.Samples.Forms.DataGridComboBox
'(DataGridComboBoxColumnから DataGridComboBoxに変更)

From上にLabel1とDaraGrid1を追加

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim dt As New DataTable("DataTable1")
dt.Columns.Add("Column1", GetType(Integer))
dt.Rows.Add(New Object() {5})
DataGrid1.DataSource = dt
Dim ts As New DataGridTableStyle
ts.MappingName = "DataTable1"
Dim comboSorce As New DataTable("ComboBox")
comboSorce.Columns.Add("DisplayMember", GetType(String))
comboSorce.Columns.Add("ValueMember", GetType(Integer))
comboSorce.Rows.Add(New Object() {"一", 1})
comboSorce.Rows.Add(New Object() {"二", 2})
comboSorce.Rows.Add(New Object() {"三", 3})
Dim cbc As New Dobon.Samples.Forms.DataGridComboBoxColumn( _
comboSorce.DefaultView, "DisplayMember", "ValueMember")
cbc.MappingName = "Column1"
cbc.HeaderText = "数字"
ts.GridColumnStyles.Add(cbc)
DataGrid1.TableStyles.Add(ts)

mText = New Dobon.Samples.Forms.DataGridComboBox
AddHandler mText.SelectedValueChanged, AddressOf ChangeText
'(mTextで生成し ハンドラを設定 ChangeTextへ飛ぶ)
End Sub

Sub ChangeText(ByVal sender As Object, ByVal e As System.EventArgs)
Me.Label1.Text = "ComoBox Change" 
'(ここでラベルのテキスト内容を変更)
End Sub
End Class

'例題のNamespaceを追加 クラスの改造はなし
Namespace
-----------
End Namespace
>>DataGridComboBoxColumnクラスを改造するのではなく、DataGridComboBoxColumnクラスのComboBoxプロパティを使ってみてください。
> 御指摘のクラス改造ではなく、クラスのComboBoxイベントをAddHandlerで設定しましたがうまくいきませんでした。クラスからのイベントがうまく取れない現象は同じです。

 管理人さまのアドバイスが反映されていないように思います。

> mText = New Dobon.Samples.Forms.DataGridComboBox
の箇所を以下のようにすれば良いのではないでしょうか?
#ここでインスタンスを新たに作っても‥‥(^_^;)

mText = cbc.ComboBox
■No11412に返信(深山さんの記事)
> >>DataGridComboBoxColumnクラスを改造するのではなく、DataGridComboBoxColumnクラスのComboBoxプロパティを使ってみてください。
>>御指摘のクラス改造ではなく、クラスのComboBoxイベントをAddHandlerで設定しましたがうまくいきませんでした。クラスからのイベントがうまく取れない現象は同じです。
>
>  管理人さまのアドバイスが反映されていないように思います。
>
>> mText = New Dobon.Samples.Forms.DataGridComboBox
> の箇所を以下のようにすれば良いのではないでしょうか?
> #ここでインスタンスを新たに作っても‥‥(^_^;)
>
> mText = cbc.ComboBox

うまくイベントを捕捉出来ました。
Eventのヘルプの一部を読んでメインのLoadにクラス生成とイベントハンドラ設定をしなければいけないと勘違いしていました。
ご指摘の内容の様にComboBoxを設定してうまくいきました。誠に有難う御座いました。初心者で質問の仕方、内容の理解がうまくいかず、ご迷惑をおかけしました。
まだまだ勉強しなければならないと感じた次第です。

DOBON.NET | プログラミング道 | プログラミング掲示板