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

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

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

Re[13]: DataGridViewのコンボボックスリスト


(過去ログ 114 を表示中)

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

■67297 / inTopicNo.1)  DataGridViewのコンボボックスリスト
  
□投稿者/ 青花 (7回)-(2013/07/23(Tue) 13:24:37)

分類:[.NET 全般] 

DataGridViewで、同じコンボボックスのリスト内容を変えて表示することは可能でしょうか?

 Flg コンボリスト
 1    赤
      黄
      桃
----------------------
 2    青
      緑
      紫
----------------------
 2    青
      緑
      紫
----------------------
 1    赤
      黄
      桃

上記の様に、フラグが1の場合と2の場合で、コンボボックスのリストの内容を変えることは可能でしょうか?


よろしくお願いします
引用返信 編集キー/
■67299 / inTopicNo.2)  Re[1]: DataGridViewのコンボボックスリスト
□投稿者/ 魔界の仮面弁士 (267回)-(2013/07/23(Tue) 14:28:46)
No67297 (青花 さん) に返信
> DataGridViewで、同じコンボボックスのリスト内容を変えて表示することは可能でしょうか?

using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private DataGridView dgv;
        private string[][] data = { null, null, null };
        public Form1()
        {
            InitializeComponent();
            data[0] = new string[] {};
            data[1] = new string[] { "赤", "黄", "桃" };
            data[2] = new string[] { "青", "緑", "紫" };
            
            dgv = new DataGridView() { Dock = DockStyle.Fill, Name = "dgv" };
            dgv.EditMode = DataGridViewEditMode.EditOnEnter;
            dgv.Columns.Add("Flg", "Flg");
            dgv.Columns.Add(new DataGridViewComboBoxColumn() {
                DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing,
                HeaderText = "コンボリスト",
                Name = "コンボリスト" });

            //dgv.DataError += delegate(object o, DataGridViewDataErrorEventArgs arg)
            //{
            //    arg.Cancel = false;
            //};
            dgv.CellValueChanged += delegate(object o, DataGridViewCellEventArgs arg)
            {
                if (arg.ColumnIndex == 0)
                {
                    DataGridView g = (DataGridView)o;
                    var r = arg.RowIndex;
                    var s = (g[0, r].Value ?? "").ToString();
                    int i; int.TryParse(s, out i);
                    if (i < 0 || i > 2) i = 0;
                    g[1, r] = new DataGridViewComboBoxCell() { DataSource = data[i], Value = data[i].FirstOrDefault() };
                    g[0, r].ErrorText = (i != 0) ? "" : "Flg には 1 または 2 を指定してください。";
                }
            };

            Controls.Add(dgv);
        }
    }
}

引用返信 編集キー/
■67308 / inTopicNo.3)  Re[2]: DataGridViewのコンボボックスリスト
□投稿者/ 青花 (8回)-(2013/07/24(Wed) 09:50:32)
言葉足らずですみません。
表示する場所を指定して、表示したいのですが、列を指定して表示する方法はありますか?


 項目1 項目2 Flg コンボリスト 項目3
  1 abc 1    赤 あ
       黄
       桃
------------------------------------------------
  2 def  2    青 い
              緑
              紫
------------------------------------------------
  3   ghi  2    青     う
              緑
              紫
------------------------------------------------
  4   jkl  1    赤     え
              黄
              桃

よろしくお願いします
引用返信 編集キー/
■67321 / inTopicNo.4)  Re[3]: DataGridViewのコンボボックスリスト
□投稿者/ 魔界の仮面弁士 (269回)-(2013/07/24(Wed) 20:20:13)
No67308 (青花 さん) に返信
> 表示する場所を指定して、表示したいのですが、列を指定して表示する方法はありますか?
> 例
>  項目1 項目2 Flg コンボリスト 項目3

先のコードで、列0の内容で列1を切り替えている所を変更して、
列2の内容で列3を切り替えるようにすれば実現できそうに思えますが、
そういうことではなく?
引用返信 編集キー/
■67322 / inTopicNo.5)  Re[4]: DataGridViewのコンボボックスリスト
□投稿者/ 青花 (9回)-(2013/07/24(Wed) 22:51:21)
> 先のコードで、列0の内容で列1を切り替えている所を変更して、
> 列2の内容で列3を切り替えるようにすれば実現できそうに思えますが、
> そういうことではなく?

 項目1、項目2、項目3は、データバインドしています。

度々、申し訳ございませんが、よろしくお願いします。

引用返信 編集キー/
■67326 / inTopicNo.6)  Re[5]: DataGridViewのコンボボックスリスト
□投稿者/ 魔界の仮面弁士 (270回)-(2013/07/25(Thu) 12:15:40)
No67322 (青花 さん) に返信
>>先のコードで、列0の内容で列1を切り替えている所を変更して、
>>列2の内容で列3を切り替えるようにすれば実現できそうに思えますが、
>>そういうことではなく?
>  項目1、項目2、項目3は、データバインドしています。

項目1、項目2、項目3がバインド列、
Flg、コンボリストはアンバウンド列ということですよね。

先のサンプルも、Flg、コンボボックス列に対してはデータバインド
させていませんので、そのまま応用できるかと思います。
引用返信 編集キー/
■67335 / inTopicNo.7)  Re[6]: DataGridViewのコンボボックスリスト
□投稿者/ 青花 (10回)-(2013/07/25(Thu) 18:44:33)

魔界の仮面弁士さんのソースをVB.Netに移植しようとしてますが、中々エラーが消えません。
一応、頑張って下記の

Dim dgv As DataGridView
Dim data As String()() '= {Null, Null, Null}

InitializeComponent()
data(0) = New String() {}
data(1) = New String() {"赤", "黄", "桃"}
data(2) = New String() {"青", "緑", "紫"}

dgv = New DataGridView() {Dock = DockStyle.Fill, Name = "dgv"}
dgv.EditMode = DataGridViewEditMode.EditOnEnter
dgv.Columns.Add("Flg", "Flg")
dgv.Columns.Add(new DataGridViewComboBoxColumn() ( _
DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing, _
HeaderText = "コンボリスト", _
Name = "コンボリスト" )


dgv.CellValueChanged += delegate( o as object, arg as DataGridViewCellEventArgs)
(
If arg.ColumnIndex = 0 Then

Dim g As DataGridView = New DataGridView o
Dim r As Integer = arg.RowIndex
Dim s As String = (g(0, r).Value = "").ToString()
Dim i As Integer= Integer.TryParse(s, out i)
If i < 0 Or i > 2 Then i = 0
g(1, r) = new DataGridViewComboBoxCell() { DataSource = data[i], Value = data[i].FirstOrDefault() }
g(0, r).ErrorText = (i <> 0) ? "" : "Flg には 1 または 2 を指定してください。"
End If
)

Controls.Add(dgv)
引用返信 編集キー/
■67336 / inTopicNo.8)  Re[7]: DataGridViewのコンボボックスリスト
□投稿者/ 青花 (11回)-(2013/07/25(Thu) 18:46:34)
魔界の仮面弁士さんのソースをVB.Netに移植しようとしてますが、中々エラーが消えません。
一応、頑張って下記の状態まで持ってきました。

Dim dgv As DataGridView
Dim data As String()() '= {Null, Null, Null}

InitializeComponent()
data(0) = New String() {}
data(1) = New String() {"赤", "黄", "桃"}
data(2) = New String() {"青", "緑", "紫"}

dgv = New DataGridView() {Dock = DockStyle.Fill, Name = "dgv"}
dgv.EditMode = DataGridViewEditMode.EditOnEnter
dgv.Columns.Add("Flg", "Flg")
dgv.Columns.Add(new DataGridViewComboBoxColumn() ( _
DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing, _
HeaderText = "コンボリスト", _
Name = "コンボリスト" )


dgv.CellValueChanged += delegate( o as object, arg as DataGridViewCellEventArgs)
(
If arg.ColumnIndex = 0 Then

Dim g As DataGridView = New DataGridView o
Dim r As Integer = arg.RowIndex
Dim s As String = (g(0, r).Value = "").ToString()
Dim i As Integer= Integer.TryParse(s, out i)
If i < 0 Or i > 2 Then i = 0
g(1, r) = new DataGridViewComboBoxCell() { DataSource = data[i], Value = data[i].FirstOrDefault() }
g(0, r).ErrorText = (i <> 0) ? "" : "Flg には 1 または 2 を指定してください。"
End If
)

Controls.Add(dgv)


ご迷惑かもしれませんが、よろしくお願いします
引用返信 編集キー/
■67338 / inTopicNo.9)  Re[8]: DataGridViewのコンボボックスリスト
□投稿者/ 魔界の仮面弁士 (272回)-(2013/07/25(Thu) 19:51:28)
No67336 (青花 さん) に返信
> 魔界の仮面弁士さんのソースをVB.Netに移植しようとしてますが、中々エラーが消えません。
VB を利用されているなら、「.NET全般」で投稿せず、VB.NET を指定してくだされば良かったのに…。(^_^;)

それから、質問時にはバージョンも明記してください。古いバージョンの VB.NET を
使っている場合には、幾つかの文法構文が使えない可能性がありますので。


> 一応、頑張って下記の状態まで持ってきました。

とりあえず、最初のコードを VB 版に訳しておきます。


Option Strict On
Option Infer On
Imports System
Imports System.Linq
Imports System.Windows.Forms
Partial Public Class Form1
    Private dgv As DataGridView
    Private data(2)() As String
    Public Sub New()
        InitializeComponent()
        data(0) = {}
        data(1) = {"赤", "黄", "桃"}
        data(2) = {"青", "緑", "紫"}
        dgv = New DataGridView() With {.Dock = DockStyle.Fill, .Name = "dgv"}
        dgv.EditMode = DataGridViewEditMode.EditOnEnter
        With dgv.Columns
            .Add("Flg", "Flg")
            .Add(New DataGridViewComboBoxColumn() With _
            {.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing _
            , .HeaderText = "コンボリスト" _
            , .Name = "コンボリスト" _
            })
        End With

        'AddHandler dgv.DataError, _
        '    Sub(o, arg)
        '        arg.Cancel = False
        '    End Sub

        AddHandler dgv.CellValueChanged, _
            Sub(o, arg)
                If arg.ColumnIndex = 0 Then
                    Dim g = DirectCast(o, DataGridView)
                    Dim r = arg.RowIndex
                    Dim s = If(g(0, r).Value, "").ToString()
                    Dim i = 0
                    Integer.TryParse(s, i)
                    If i < 0 OrElse i > 2 Then i = 0
                    g(1, r) = New DataGridViewComboBoxCell() With _
                    {.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing _
                    , .DataSource = data(i) _
                    , .Value = data(i).FirstOrDefault() _
                    }
                    g(0, r).ErrorText = If(i <> 0, "", "Flg には 1 または 2 を指定してください。")
                End If
            End Sub

        Controls.Add(dgv)
    End Sub
End Class


上記では、最初の C# のコードで書き漏らしていた
「DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing」
の指定を追加しています。付けるかどうかはお好みで。

引用返信 編集キー/
■67339 / inTopicNo.10)  Re[9]: DataGridViewのコンボボックスリスト
□投稿者/ 魔界の仮面弁士 (273回)-(2013/07/25(Thu) 20:06:54)
No67338 (魔界の仮面弁士) に追記
> それから、質問時にはバージョンも明記してください。古いバージョンの VB.NET を
> 使っている場合には、幾つかの文法構文が使えない可能性がありますので。

バージョン依存のコードを廃しました。VB2005以降であれば動作するはずです。


Option Strict On
Imports System
Imports System.Windows.Forms
Partial Public Class Form1
    Private WithEvents dgv As DataGridView
    Private data(2)() As String
    Public Sub New()
        InitializeComponent()
        ReDim data(0)(-1)
        data(1) = New String() {"赤", "黄", "桃"}
        data(2) = New String() {"青", "緑", "紫"}
        dgv = New DataGridView()
        With dgv
            .Dock = DockStyle.Fill
            .Name = "dgv"
            .EditMode = DataGridViewEditMode.EditOnEnter

        End With
        With dgv.Columns
            Dim col As New DataGridViewComboBoxColumn()
            col.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
            col.HeaderText = "コンボリスト"
            col.Name = "コンボリスト"
            .Add("Flg", "Flg")
            .Add(col)
        End With
        Controls.Add(dgv)
    End Sub

    'Private Sub dgv_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) Handles dgv.DataError
    '    e.Cancel = True
    'End Sub

    Private Sub dgv_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles dgv.CellValueChanged
        If e.ColumnIndex = 0 Then
            Dim g As DataGridView = DirectCast(sender, DataGridView)
            Dim r As Integer = e.RowIndex
            Dim o As Object = g(0, r).Value
            Dim i As Integer = 0
            If o IsNot Nothing Then
                Dim s As String = o.ToString()
                Integer.TryParse(s, i)
                If i < 0 OrElse i > 2 Then
                    i = 0
                End If
            End If
            Dim combo As New DataGridViewComboBoxCell()
            With combo
                .DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
                .DataSource = data(i)
                If data(i).Length > 0 Then
                    .Value = data(i)(0)
                Else
                    .Value = Nothing
                End If
                g(1, r) = combo
            End With
            If i <> 0 Then
                g(0, r).ErrorText = ""
            Else
                g(0, r).ErrorText = "Flg には 1 または 2 を指定してください。"
            End If
        End If
    End Sub
End Class

引用返信 編集キー/
■67349 / inTopicNo.11)  Re[10]: DataGridViewのコンボボックスリスト
□投稿者/ 青花 (12回)-(2013/07/26(Fri) 16:57:23)

Private data(2)() As String

Public Sub New()

InitializeComponent()
ReDim data(0)(-1)
data(1) = New String() {"赤", "黄", "桃"}
data(2) = New String() {"青", "緑", "紫"}
'DataGridView3 = New DataGridView
With DataGridView3
.Dock = DockStyle.Fill
.Name = "dgv"
.EditMode = DataGridViewEditMode.EditOnEnter

End With
With DataGridView3.Columns
Dim col As New DataGridViewComboBoxColumn()
col.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
col.HeaderText = "コンボリスト"
col.Name = "コンボリスト"
.Add("Flg", "Flg")
.Add(col)
End With

Controls.Add(DataGridView3)

End Sub

Private Sub dgv_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView3.CellValueChanged

If e.ColumnIndex = 0 Then
Dim g As DataGridView = DirectCast(sender, DataGridView)
Dim r As Integer = e.RowIndex
Dim o As Object = g(0, r).Value
Dim i As Integer = 0
If o IsNot Nothing Then
Dim s As String = o.ToString()
Integer.TryParse(s, i)
If i < 0 OrElse i > 2 Then
i = 0
End If
End If
Dim combo As New DataGridViewComboBoxCell()
With combo
.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
.DataSource = data(i)
If data(i).Length > 0 Then
.Value = data(i)(0)
Else
.Value = Nothing
End If
g(1, r) = combo
End With
If i <> 0 Then
g(0, r).ErrorText = ""
Else
g(0, r).ErrorText = "Flg には 1 または 2 を指定してください。"
End If
End If
End Sub


DataGridView3にバインドしたいのですが、From全体にバインドされます。

Controls.Add(DataGridView3) の部分を変えてみましたが無理でした。
ちなみに、VB2008です。

よろしくお願いします



引用返信 編集キー/
■67350 / inTopicNo.12)  Re[11]: DataGridViewのコンボボックスリスト
□投稿者/ 青花 (13回)-(2013/07/26(Fri) 17:22:50)
申し訳ございません。

'With DataGridView3
' .Dock = DockStyle.Fill
' .Name = "dgv"
' .EditMode = DataGridViewEditMode.EditOnEnter
'End With

上記の部分をコメント行にしたらうまくいきました。

ただ、Flg列をバインドすることになり、上手くバインドできなくて困っています。


よろしくお願いします
引用返信 編集キー/
■67351 / inTopicNo.13)  Re[12]: DataGridViewのコンボボックスリスト
□投稿者/ 魔界の仮面弁士 (275回)-(2013/07/26(Fri) 18:29:56)
No67350 (青花 さん) に返信
> 上記の部分をコメント行にしたらうまくいきました。
少なくとも、DataGridView3 の名前を実行時に dgv に変更するのはマズイでしょうね。

ところで、先のコードそのものの動作は、期待した結果に近いものになっていたのでしょうか?

また、それを自分のプログラムに適用するに当たり、各行の意味を理解した上で
ソースコードに手を加えていますか? (意味の分からない部分は無いですか?)


> ただ、Flg列をバインドすることになり、上手くバインドできなくて困っています。

具体的には、どのようにバインドさせようとして、実際にはどうなってしまうのでしょうか?


それから、(繰り返しになりますが)質問時には開発環境のバージョンも明記しましょう。
引用返信 編集キー/
■67352 / inTopicNo.14)  Re[13]: DataGridViewのコンボボックスリスト
□投稿者/ 青花 (14回)-(2013/07/26(Fri) 20:27:08)
> ところで、先のコードそのものの動作は、期待した結果に近いものになっていたのでしょうか?

コンボボックスの中の値が空ですが、セルのフォーカスを変更すると、コンボボックスの1番上の値が表示され、
コンボボックスからテキストボックスに変わります。

>>ただ、Flg列をバインドすることになり、上手くバインドできなくて困っています。
> 具体的には、どのようにバインドさせようとして、実際にはどうなってしまうのでしょうか?

DataGridView.DataSource = DataTable

> それから、(繰り返しになりますが)質問時には開発環境のバージョンも明記しましょう。

inTopicNo.11に明記したと思いますが、VB2008です。
OSはWin7です。
DBは、オラクル11gです。


よろしくお願います。


引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -