DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33462 / inTopicNo.1)  DataGridViewにおいたComboBoxの表示
  
□投稿者/ らすお 一般人(1回)-(2016/08/25(Thu) 16:01:15)
  • アイコン環境/言語:[Winodws7 VisualBasic2015] 
    分類:[.NET] 

    VisualBasic2015にてDataGridViewにComboBoxを置くところまではできています。
    実行するとComboの中身は指定した文字列をせんたくできますが、Comboからデータを選んでフォーカスが外れると数値データが入ってしまいます。
    文字列の方を表示したいのですが一向にできません。
    どなたか助言を戴けたらと思います。

    下記にコードを書いておきます。
    Dim comboSorce As New DataTable("ComboBox")
    comboSorce.Columns.Add("DisplayMember", GetType(String))
    comboSorce.Columns.Add("ValueMember", GetType(Integer))

    comboSorce.Rows.Add("日曜日", 0)
    comboSorce.Rows.Add("月曜日", 10)
    comboSorce.Rows.Add("火曜日", 20)

    'DataGridViewComboBoxColumnを作成
    Dim column As New DataGridViewComboBoxColumn()
    '表示する列の名前を設定する
    column.DataPropertyName = DGridV1.Columns("曜日").DataPropertyName
    '選択したもののみコンボで表示
    column.DisplayStyleForCurrentCellOnly = True

    'DataGridViewComboBoxColumnのDataSourceを設定
    column.DataSource = comboSorce
    '実際の値が"Value"列、表示するテキストが"Display"列とする
    column.ValueMember = "ValueMember"
    column.DisplayMember = "DisplayMember"
    '現在の列が存在している位置に挿入する
    DGridV1.Columns.Insert(DGridV1.Columns("曜日").Index, column)
    '今までの列を削除する
    DGridV1.Columns.Remove("曜日)
    '挿入した列の名前をいれる
    column.Name = "曜日"
引用返信 削除キー/
■33464 / inTopicNo.2)  Re[1]: DataGridViewにおいたComboBoxの表示
□投稿者/ 魔界の仮面弁士 大御所(1046回)-(2016/08/25(Thu) 20:15:05)
  • アイコンNo33462に返信(らすおさんの記事)
    > column.DataPropertyName = DGridV1.Columns("曜日").DataPropertyName

    上記で指定されている DGridV1.Columns("曜日") は、
    デザイン時に設定しているものでしょうか?
    それとも、コードから明示的に Columns.Add したものですか?
    あるいは、AutoGenerateColumns = True によって、
    "曜日" 列が自動的に割り当てられた状態でしょうか?

    また、DataPropertyName で指定されている
    バインド元データの項目のデータは何型でしょうか。(Integer 型ですか?)


    > 実行するとComboの中身は指定した文字列をせんたくできますが、Comboからデータを選んでフォーカスが外れると数値データが入ってしまいます。

    これは、DGridV1.DataSource に対して、0、10、20 が入ってしまうという
    意味でしょうか。
    それとも、フォーカスが外れた時に、ComboBox セルの見た目が
    曜日名ではなく数字になってしまうという意味でしょうか。

    (どちらのパターンも再現しておらず、状況を把握できていません)
引用返信 削除キー/
■33470 / inTopicNo.3)  Re[2]: DataGridViewにおいたComboBoxの表示
□投稿者/ らすお 一般人(3回)-(2016/08/26(Fri) 10:12:03)
  • アイコン魔界の仮面弁士さん
    ご回答ありがとうございます。

    > 上記で指定されている DGridV1.Columns("曜日") は、
    > デザイン時に設定しているものでしょうか?
    > それとも、コードから明示的に Columns.Add したものですか?
    最初の段階でコードより明示的にAddしています。
    下記で先にAddしています。
    Dim Work_DT as New DataTable (Class宣言)

    WorkN_DT.Columns.Add("名称", Type.GetType("System.String"))
    Work_DT.Columns.Add("No", Type.GetType("System.Int64"))
    Work_DT.Columns.Add("曜日", Type.GetType("System.Int64"))

    Work_DT.Clear()
        DGridV1.DataSource = Work_DT

    > あるいは、AutoGenerateColumns = True によって、
    > "曜日" 列が自動的に割り当てられた状態でしょうか?
    AutoGenerateColumns は特に設定していませんでしたが
    自動で列が生成されてはいないはずです。

    > また、DataPropertyName で指定されている
    > バインド元データの項目のデータは何型でしょうか。(Integer 型ですか?)
    Integer型です。

    >>実行するとComboの中身は指定した文字列をせんたくできますが、Comboからデータを選んでフォーカスが外れると数値データが入ってしまいます。
    >
    > これは、DGridV1.DataSource に対して、0、10、20 が入ってしまうという
    > 意味でしょうか。
    DGridV1.DataSourceは0、10、20です。
    これで正しいと思っているのが間違いでしょうか?
    グリッドのDataSourceは0、10、20でも表示はDisplayMemberの表示
    になると思っています。

    > それとも、フォーカスが外れた時に、ComboBox セルの見た目が
    > 曜日名ではなく数字になってしまうという意味でしょうか。
    その通りです。別のセルにフォーカスを移動したときに0,10,20が入ります。

    以上です。追記ですがフォームロード後に仮にボタンを押したときにデータを追加するようにしています。
    Dim DR As DataRow
    Work_DT.Clear()
    DR = Work_DT.NewRow
    '**************グリッドに格納*****************
    'グリッドにデータ書き込み
    DR.Item(0) = "Test"
    DR.Item(1) = 1
    DR.Item(2) = 10 '月曜

    Work_DT.Rows.Add(DR)
    DGridV1.DataSource = Work_DT
    DGridV1.Rows(i).HeaderCell.Value = 1

引用返信 削除キー/
■33471 / inTopicNo.4)  Re[3]: DataGridViewにおいたComboBoxの表示
□投稿者/ 魔界の仮面弁士 大御所(1047回)-(2016/08/26(Fri) 10:51:45)
  • アイコンNo33470に返信(らすおさんの記事)
    > WorkN_DT.Columns.Add("名称", Type.GetType("System.String"))
    Work_DT は分かりましたが、
    WorkN_DT が何か分かりませんでした。

    それと、comboSorce の時と WorkN_DT や Work_DT の時とで、型の指定表記が
    異なっているようですが、あえてそうしているのでしょうか。

    上記の Type.GetType("System.String") は、comboSorce 同様に
    GetType(String) の方が良いと思いますよ。コンパイル時に検証してもらえるので。
    今回は、文字列でなければ指定できない型というわけでも無いのですし。


    >>バインド元データの項目のデータは何型でしょうか。(Integer 型ですか?)
    > Integer型です。
    違いますよね?

    > Work_DT.Columns.Add("曜日", Type.GetType("System.Int64"))
    上記を見ると、Int64 型になっています。


    > DGridV1.DataSourceは0、10、20です。
    > これで正しいと思っているのが間違いでしょうか?
    正しいと思いますが、「0、10、20 が入ってしまう」という
    質問内容だったので、確認した次第です。

    > その通りです。別のセルにフォーカスを移動したときに0,10,20が入ります。
    ComboBox が持つ ValueMember が GetType(Integer) なのに対し、
    DataSource が持つ 曜日 が Type.GetType("System.Int64") だからです。
    データ型を一致させましょう。


    そもそもこの時点で、データ型が異なっているわけですから、
    フォーカス喪失時に警告が発っせられるはずなんですけれどね…。
    DGridV1 の DataError イベントで e.Cancel = False などとして、
    警告を握りつぶしていたりはしませんか?



    > DR.Item(1) = 1
    > DR.Item(2) = 10 '月曜
    それぞれの列が Type.GetType("System.Int64") である以上、上記は本来、
     DR.Item(1) = 1L
     DR.Item(2) = 10L '月曜
    あるいは
     DR.Item(1) = 1&
     DR.Item(2) = 10& '月曜
    のように、Int64 型のリテラルで記述されるのが望ましいです。
    拡大変換なので、このケースでは Integer 型のリテラルのままでも問題無いですが。
引用返信 削除キー/
■33472 / inTopicNo.5)  Re[4]: DataGridViewにおいたComboBoxの表示
□投稿者/ らすお 一般人(4回)-(2016/08/26(Fri) 11:25:35)
  • アイコン魔界の仮面弁士さん
    再度ありがとうございます。

    >>WorkN_DT.Columns.Add("名称", Type.GetType("System.String"))
    > Work_DT は分かりましたが、
    > WorkN_DT が何か分かりませんでした。
    申し訳ありません。
    単純なコピーとしていなかったので打ち間違えました。
    Work_DTを総称としています。


    > >>バインド元データの項目のデータは何型でしょうか。(Integer 型ですか?)
    >>Integer型です。
    > 違いますよね?
    >
    >>Work_DT.Columns.Add("曜日", Type.GetType("System.Int64"))
    > 上記を見ると、Int64 型になっています。
    >
    >>その通りです。別のセルにフォーカスを移動したときに0,10,20が入ります。
    > ComboBox が持つ ValueMember が GetType(Integer) なのに対し、
    > DataSource が持つ 曜日 が Type.GetType("System.Int64") だからです。
    > データ型を一致させましょう。
    comboSorce.Columns.Add("ValueMember", GetType(Integer))
    のGetType(Integer)を勝手にInt64と勘違いしていました。
    よく見るとInt32ですね・・・

    > そもそもこの時点で、データ型が異なっているわけですから、
    > フォーカス喪失時に警告が発っせられるはずなんですけれどね…。
    > DGridV1 の DataError イベントで e.Cancel = False などとして、
    > 警告を握りつぶしていたりはしませんか?
    御推察の通りe.Cancel = Falseで握りつぶしていました。
    グリッドに自由にデータを入れれると誤入力によるエラーが頻発するので
    いつもの流れで入れていました。
    デバッグ時にはエラーが見えず予測外の動きに混乱しますね。気を付けます。

    問題の件ですが、Add時の型をInt32
    Work_DT.Columns.Add("曜日", Type.GetType("System.Int32"))
    に変更することでセルに文字列の表示ができました。

    つたないミスですが気づくことができませんでした。
    魔界の仮面弁士さん 
    ありがとうございました。




解決み!
引用返信 削除キー/



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

このトピックに書きこむ

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

Mode/  Pass/


- Child Tree -