- PR -

DataGridView にボタン追加した時のColumnIndex

1
投稿者投稿内容
PYUPYU
会議室デビュー日: 2004/06/23
投稿数: 8
投稿日時: 2007-03-08 10:31
恐ろしく初歩的だとは思うのですが、狐につままれた
状態です。
DataGridViewに非連結のボタンを
dgvMain.Columns.Insert(4, ButtonColumn)
にて挿入しました。
画面上は5列目にちゃんと表示されていますが、
dgvMain_CellClickのイベントのe.ColumnIndexを拾うと
「0」となっています。そのおかげでENTER移動等がずれて
しまいます。何故ColumnIndexがDataGridViewButtonColumnは
0からスタートされてしまうのでしょうか
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-03-08 11:25
e.ColumnIndexはDisplayIndexとは異なるので、画面の表示順と異なる可能性はありますが、
こちらで試してみましたところ、挿入した列をクリックした場合、
正しくと挿入した列番号が取得できました。
他に何か特殊なことをされていませんか?

以下、検証用のコードです。言語書いてありませんのでVBで作りました。
Windowsフォームに DataGridView1 という名前のDataGridViewを置いて実行してください。

コード:
    Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As _
        System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick

        Debug.Print("Clicked e.ColumnIndex = {0}", e.ColumnIndex)

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MyBase.Load

        Dim newColumn As New DataGridViewTextBoxColumn
        newColumn.Name = "InsertedColumn"
        DataGridView1.Columns.Insert(4, newColumn)

    End Sub


PYUPYU
会議室デビュー日: 2004/06/23
投稿数: 8
投稿日時: 2007-03-08 12:35
デバッグしたところDataSource をバインドする前はColumnIndex は正しく
振られているのですが、バインド後にボタンが0から振られてしまいます。
それで下記のようにバインドした後にボタンを追加したのですが
それでもColumnIndexは0となってしまいます。??

With DataGridView1

Dim col1 As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn
'ヘッダータイトル設定
col1.HeaderText = Con_Grid_Title_03
'データグリッドのバインド列名
col1.DataPropertyName = "A"

Dim col2 As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn
'ヘッダータイトル設定
col2.HeaderText = Con_Grid_Title_04
'データグリッドのバインド列名
col2.DataPropertyName = "B"

Dim col3 As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn
'ヘッダータイトル設定
col3.HeaderText = Con_Grid_Title_05
'データグリッドのバインド列名
col3.DataPropertyName = "C"

Dim col4 As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn
'ヘッダータイトル設定
col4.HeaderText = Con_Grid_Title_06
'データグリッドのバインド列名
col4.DataPropertyName = "D"

' 作成したカラムオブジェクトを追加.
.Columns.AddRange(New DataGridViewColumn() {col1, col2, col3, col4})

.Columns(0).Name = Con_Grid_Title_03
.Columns(1).Name = Con_Grid_Title_04
.Columns(2).Name = Con_Grid_Title_05
.Columns(3).Name = Con_Grid_Title_06

End With

'データセット
rs.TableIndex = Con_Grid_TableName
DataGridView1.DataSource = rs.DataTable

'画面追加
Me.Controls.Add(DataGridView1)


'非連結のボタンは後から追加
Dim ButtonColumn As New DataGridViewButtonColumn

ButtonColumn.Name = Con_Grid_Title_07 '列の名前。プログラム中で使用する。
ButtonColumn.HeaderText = Con_Grid_Title_07 '列の見出しに表示するテキスト
ButtonColumn.Text = Con_Grid_Title_07 'ボタンに表示するテキスト
ButtonColumn.Width = 50 '列の幅
ButtonColumn.UseColumnTextForButtonValue = True
DataGridView1.Columns.Insert(4, ButtonColumn)
PYUPYU
会議室デビュー日: 2004/06/23
投稿数: 8
投稿日時: 2007-03-08 12:49
自己レスです。
いやいやながらもバインド元のDataSource にボタン用の
項目を" 1 AS F "等で追加し
バインドしたところColumnIndex は正しく振られました。
??バインドしていない項目はColumnIndex が
0に振られるということですかね〜〜〜釈然としないです。
何か私がミスっているような気がします。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-03-08 13:52
うーん…何故なんでしょう。
提示頂いたコードを動くように少し手直ししてやってみましたが、
ボタンの列をクリックすると、正しく「Clicked e.ColumnIndex = 4」と出力されます。
直した部分が影響していないとも言い切れませんが、こちらでは全く再現しません。

デザイナ上でDataGridViewを置かずに、空のフォームに以下のソースを記述します。
(手を加えた部分は太字にしてあります)

コード:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim DataGridView1 As DataGridView = New DataGridView()

        Dim tbl As New DataTable()
        tbl.Columns.Add("A")
        tbl.Columns.Add("B")
        tbl.Columns.Add("C")
        tbl.Columns.Add("D")

        Const Con_Grid_Title_03 As String = "SourceColumn1"
        Const Con_Grid_Title_04 As String = "SourceColumn2"
        Const Con_Grid_Title_05 As String = "SourceColumn3"
        Const Con_Grid_Title_06 As String = "SourceColumn4"
        Const Con_Grid_Title_07 As String = "ButtonColumn"

        With DataGridView1

            Dim col1 As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn
            'ヘッダータイトル設定 
            col1.HeaderText = Con_Grid_Title_03
            'データグリッドのバインド列名 
            col1.DataPropertyName = "A"

            Dim col2 As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn
            'ヘッダータイトル設定 
            col2.HeaderText = Con_Grid_Title_04
            'データグリッドのバインド列名 
            col2.DataPropertyName = "B"

            Dim col3 As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn
            'ヘッダータイトル設定 
            col3.HeaderText = Con_Grid_Title_05
            'データグリッドのバインド列名 
            col3.DataPropertyName = "C"

            Dim col4 As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn
            'ヘッダータイトル設定 
            col4.HeaderText = Con_Grid_Title_06
            'データグリッドのバインド列名 
            col4.DataPropertyName = "D"

            ' 作成したカラムオブジェクトを追加. 
            .Columns.AddRange(New DataGridViewColumn() {col1, col2, col3, col4})

            .Columns(0).Name = Con_Grid_Title_03
            .Columns(1).Name = Con_Grid_Title_04
            .Columns(2).Name = Con_Grid_Title_05
            .Columns(3).Name = Con_Grid_Title_06

        End With

        'データセット 
        'rs.TableIndex = Con_Grid_TableName
        DataGridView1.DataSource = tbl

        '画面追加 
        Me.Controls.Add(DataGridView1)


        '非連結のボタンは後から追加 
        Dim ButtonColumn As New DataGridViewButtonColumn

        ButtonColumn.Name = Con_Grid_Title_07 '列の名前。プログラム中で使用する。 
        ButtonColumn.HeaderText = Con_Grid_Title_07 '列の見出しに表示するテキスト 
        ButtonColumn.Text = Con_Grid_Title_07 'ボタンに表示するテキスト 
        ButtonColumn.Width = 50 '列の幅 
        ButtonColumn.UseColumnTextForButtonValue = True
        DataGridView1.Columns.Insert(4, ButtonColumn)


        AddHandler DataGridView1.CellClick, AddressOf DataGridView1_CellClick
    End Sub

    Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As _
        System.Windows.Forms.DataGridViewCellEventArgs)

        Debug.Print("Clicked e.ColumnIndex = {0}", e.ColumnIndex)

    End Sub




これで、ボタンのセルをクリックすると「Clicked e.ColumnIndex = 4」と出力されませんか?
1

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