掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
データグリッド上のコンボボックスで、"←"キーでセルを左に移動させるには? (ID:115798)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
いつもお世話になっております。表題の件ですが、いろいろ試してみたのですが、うまくいきません。 コンボボックス側の仕様は以下のようになっております。 このコンボボックスにキー押下時の処理を加えてあげればよいのでしょうか!? 初心者なもので、このような低レベルな質問になってしまいますが、分かる方がおりましたら、宜しくお願いいたします。 Imports System Imports System.Data Imports System.Windows.Forms Imports System.Drawing Public Class DataGridComboBoxColumn Inherits DataGridTextAlignColumn 'Inherits DataGridTextBoxColumn Private _comboBox As DataGridComboBox Private _sorce As CurrencyManager Private _rowNumber As Integer Private _editing As Boolean '/ <summary> '/ DataGridComboBoxColumnのコンストラクタ '/ </summary> '/ <param name="dataSource">ComboBoxのDataSource</param> '/ <param name="displayMember">ComboBoxのDisplayMember</param> '/ <param name="valueMember">ComboBoxのValueMember</param> Public Sub New(ByVal dataSource As DataView, _ ByVal displayMember As String, _ ByVal valueMember As String) '初期設定 _sorce = Nothing _editing = False 'DataGridComboBoxの作成 _comboBox = New DataGridComboBox 'ComboBoxの設定 _comboBox.DropDownStyle = ComboBoxStyle.DropDown _comboBox.Visible = True 'データソースの設定 _comboBox.DataSource = dataSource _comboBox.DisplayMember = displayMember _comboBox.ValueMember = valueMember 'イベントハンドラ AddHandler _comboBox.Leave, AddressOf _comboBox_Leave AddHandler _comboBox.SelectionChangeCommitted, _ AddressOf _comboBox_SelectionChangeCommitted 'AddHandler _comboBox.TextChanged, AddressOf _comboBox_TextChanged End Sub 'プロパティ '/ <summary> '/ 管理されている ComboBox コントロールを取得します。 '/ </summary> Public ReadOnly Property ComboBox() As DataGridComboBox Get Return _comboBox End Get End Property 'ComboBoxからフォーカスが離れた Private Sub _comboBox_Leave(ByVal sender As Object, _ ByVal e As EventArgs) If _editing Then 'ComboBoxが編集中だったとき _editing = False '行の値を更新する SetColumnValueAtRow(_sorce, _rowNumber, _ _comboBox.Text) Invalidate() End If 'ComboBoxを隠す _comboBox.Visible = False 'DataGridのスクロールイベントを捕捉する AddHandler DataGridTableStyle.DataGrid.Scroll, _ AddressOf DataGrid_Scroll End Sub 'DataGridがスクロール Private Sub DataGrid_Scroll(ByVal sender As Object, _ ByVal e As EventArgs) 'ComboBoxを消す If _comboBox.Visible Then _comboBox.Visible = False End If End Sub 'ComboBoxで選択した項目が変更されて、その変更がコミットされた Private Sub _comboBox_SelectionChangeCommitted( _ ByVal sender As Object, ByVal e As EventArgs) _editing = True 'DataGridに列が編集開始されたことを知らせる MyBase.ColumnStartedEditing(CType(sender, Control)) End Sub '行の最小の高さ Protected Overrides Function GetMinimumHeight() As Integer Return _comboBox.PreferredHeight End Function 'ComboBoxをDataGridのControl.ControlCollectionに追加する Protected Overrides Sub SetDataGridInColumn( _ ByVal value As DataGrid) MyBase.SetDataGridInColumn(value) _comboBox.Parent = CType(value, Control) End Sub '列が管理しているコントロールへのフォーカスを '放棄する必要があることを列に通知 Protected Overrides Sub ConcedeFocus() MyBase.ConcedeFocus() _comboBox.Visible = False End Sub ''編集するためにセルを準備する Protected Overloads Overrides Sub Edit( _ ByVal source As CurrencyManager, _ ByVal rowNum As Integer, _ ByVal bounds As Rectangle, _ ByVal [readOnly] As Boolean, _ ByVal instantText As String, _ ByVal cellIsVisible As Boolean) '基本クラスのEditを呼び出す MyBase.Edit(source, rowNum, bounds, [readOnly], _ instantText, cellIsVisible) 'TextBoxを消す Me.TextBox.Visible = False '値の保存 _rowNumber = rowNum _sorce = source '表示させるComboBoxの設定をする _comboBox.Bounds = bounds _comboBox.RightToLeft = _ Me.DataGridTableStyle.DataGrid.RightToLeft '非表示、読み取り専用のときは、ComboBoxを表示しない If cellIsVisible AndAlso Not [readOnly] Then 'ComboBoxを表示 _comboBox.Visible = True _comboBox.BringToFront() _comboBox.Focus() End If '選択項目の変更 'ComboBoxを表示する前に行うと、 '新しい行で値を変更した時不都合が起きる _comboBox.SelectedIndex = _ _comboBox.FindStringExact(Me.TextBox.Text) 'DataGridのスクロールイベントを捕捉する AddHandler DataGridTableStyle.DataGrid.Scroll, _ AddressOf DataGrid_Scroll End Sub '編集プロシージャを完了する Protected Overrides Function Commit( _ ByVal dataSource As CurrencyManager, _ ByVal rowNum As Integer) As Boolean If _editing Then '編集中のときは、rowNum行の値を設定する _editing = False SetColumnValueAtRow(dataSource, rowNum, _ _comboBox.Text) End If Return True End Function '指定した行の値を設定 Protected Overrides Sub SetColumnValueAtRow( _ ByVal source As CurrencyManager, _ ByVal rowNum As Integer, ByVal value As Object) 'ValueMemberの値を設定する MyBase.SetColumnValueAtRow(source, rowNum, _ _comboBox.FindValueMember(value)) End Sub '指定した行の値を取得 Protected Overrides Function GetColumnValueAtRow( _ ByVal source As CurrencyManager, _ ByVal rowNum As Integer) As Object Dim val As Object = _ MyBase.GetColumnValueAtRow(source, rowNum) 'DisplayMemberの値を返す Return _comboBox.FindDisplayMember(val) End Function End Class Public Class DataGridComboBox Inherits System.Windows.Forms.ComboBox Private WM_KEYUP As Integer = &H101 Protected Overrides Sub WndProc( _ ByRef theMessage As System.Windows.Forms.Message) 'キー操作を無効にする() If theMessage.Msg = WM_KEYUP Then Return End If MyBase.WndProc(theMessage) End Sub '/ <summary> '/ DisplayMemberからValueMemberの値を探す '/ </summary> '/ <param name="display">探すDisplayMember値</param> '/ <returns>見つかったValueMember値</returns> Public Function FindValueMember( _ ByVal display As Object) As Object Dim dv As DataView = CType(DataSource, DataView) Dim rowCount As Integer = dv.Count 'ループして探す Dim disp As Object Dim i As Integer For i = 0 To rowCount - 1 disp = dv(i)(DisplayMember) '見つかった時 If display.Equals(disp) Then Return dv(i)(ValueMember) End If Next i '見つからなかった時 Return DBNull.Value End Function '/ <summary> '/ ValueMemberからDisplayMemberの値を探す '/ </summary> '/ <param name="value">探すValueMember値</param> '/ <returns>見つかったDisplayMember値</returns> Public Function FindDisplayMember( _ ByVal value As Object) As Object Dim dv As DataView = CType(DataSource, DataView) Dim rowCount As Integer = dv.Count 'ループして探す Dim val As Object Dim i As Integer For i = 0 To rowCount - 1 val = dv(i)(ValueMember) '見つかった時 If value.Equals(val) Then Return dv(i)(DisplayMember) End If Next i '見つからなかった時 Return DBNull.Value End Function End Class
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.