DataGridViewのボタン列について

タグの編集
投稿者 SSD  (社会人) 投稿日時 2022/11/21 13:34:55
DataGridViewに自作クラスのコレクション(List)をバインドしています。
以下のような感じです。

Public Class MyClass
    Public Property A As Boolean
    Public Property B As Integer
    Public Property C As String
End Class

Public Class MyDataGridView
    Sub ShowData()
        Dim list as New List(Of MyClass)
        list.Add(New MyClass With {.A = True, .B = 123, .C = "abc"})
        Me.DataGridView1.DataSource = list
    End Sub
End Class


列の表示名を変えたい場合、MyClassのプロパティにDisplayNameAttributeを用いています。
それと同様にプロパティに属性をつけるか、特定の型にするなどで特定の列をボタン(DataGridViewButtonColumn)にすることはできないでしょうか?

ご存じの方いらっしゃいましたらご教示お願いいたします。

言語:VisualBasic
フレームワーク:.Net Framwork 4.7.2
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/11/21 15:37:36
あれ? MyClass は予約語ですよね?
https://learn.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/program-structure/me-my-mybase-and-myclass

なので、どうしてもその名を使いたいなら、
Public Class MyClass ではなく、
Public Class [MyClass] と書く必要があるハズ。


> Dim list as New List(Of MyClass)
ユーザーに、レコードの削除や追加も行わせたい場合は、
 Me.DataGridView1.DataSource = list
の代わりに
 Me.DataGridView1.DataSource = New BindingList(Of [MyClass])(list)
を使うことができます。


> 特定の型にするなどで特定の列をボタン(DataGridViewButtonColumn)にすることはできないでしょうか?
デザイン時または実行時に、明示的に DataGridViewButtonColumn あるいは
DataGridViewButtonCell を割り当てる必要があります。

DataGridView1.AutoGenerateColumns = True
で自動割当された場合に考慮されるのは、

① Boolean または CheckState 型 なら DataGridViewCheckBoxColumn
② Image 型として扱える型なら DataGridViewImageColumn
③ それ以外はすべて DataGridViewTextBoxColumn
だったはずです。
https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/DataGridViewDataConnection.cs,994
投稿者 SSD  (社会人) 投稿日時 2022/11/22 09:58:14
魔界の仮面弁士 様

> あれ? MyClass は予約語ですよね?
これは例として例示するために適当に書いたコードなので、
そこまで意識していませんでした。

BindingListというのがあるんですね。
ちょうどListコレクションをバインドさせたときにコントロールで行の削除、追加ができずにいたので
今の私にドンピシャなコレクションです、ありがとうございます。

DataGridViewにコレクションなどをバインドさせたときの挙動がよくわからず、
ご提示いただいたソースコードのような情報を探していました。
.NET環境のVBを半年ほど前に始めたんですが、C言語はまだあまりわからないので
少しずつ読んでいこうと思います。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/11/22 10:08:47
> C言語はまだあまりわからないので
先の URL は、"C" ではなく "C#" のものですよ。

メロン と メロンパン、
インド と インドネシア、
BASIC と Visual Basic ぐらい違います。


".NET Framework" のソースコードはこちら。
https://referencesource.microsoft.com/download.html
https://referencesource.microsoft.com/

".NET" のソースコードはこちら。
https://source.dot.net/
投稿者 SSD  (社会人) 投稿日時 2022/11/22 14:56:26
魔界の仮面弁士 様

> BASIC と Visual Basic ぐらい違います。
ああ、なるほど。
Cの解説サイトを見ていてよく見る(おそらくC#の)コードと何かが違うと思ってたんですが、
そういうことだったんですね。

話はそれてしまいますが、Cを学習せずともC#からいきなり学習し始められるのでしょうか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/11/22 20:40:19
> Cを学習せずともC#からいきなり学習し始められるのでしょうか?

えぇと…それは、どういう意味の質問でしょうか?

VB.NET の質問から外れて、突然 C# を学習し始める話に変わってしまったようですが、
前提条件が何もないので、何とも答えにくいです。

C# は、C++、C言語、Java などに影響を受けて開発された言語ですが、
だからといって事前に C 言語を学んでおかねばならない…なんてことはありません。
日本の漢字は中国大陸から入ってきた文字をベースにしていますが、
中国語を知らなくても日本語を書けますよね、という程度の意味で。


何らかの言語を学びたいのだけれど、Python とか Java とか数多くの言語がある中、
最初の言語として C# を選択しようと思ったけれど、先に C を学んでおくべきか、という話ですか?

あるいは選択肢を絞って、 C / C++ / C# の 3 種をすべて学びたいけれど、その中で
最初に C# から勉強し始めても良いだろうか、という話ですか?


習得したいのが C# だけなのであれば、C# の前に C を学んでおく必要は無いと思います。
かといって、先に C なり VB なり C++ を学んではいけない、という事も当然無いでしょう。


C# 自体の学習難易度を問うているであれば、その人の事前知識や素質、あるいは
学習教材が本人にあっているかにも左右されるので、正直「人によって違う」としか言えません。

ただ、未経験者向けの『新人研修』でも長年使われていますし、初めての言語として
選択すること自体は、まったく問題ないと思います。


初めての言語が Python でも C# でも VBA でも JavaScript でも構わないわけですが、
プログラミングに慣れていない場合、学生であれば学校や友人に相談できる言語から
勉強し始めるのが楽だと思います。

たとえば高校生であれば、必修科目である「情報Ⅰ」で習う言語から始めてみるのも手です。
情報Ⅰ/Ⅱ に情報言語指定は無いはずですが、自分の学校で教えている言語を選べば、
学校の教員に質問や相談を投げかけやすいでしょう。
(Python, Scratch, JavaScript, VBA あたりを採用する学校が多いと聞いています)

小中学生なら、言語よりもビジュアル的な所から入った方が分かりやすいので、
Springin' や Scratch なども良いかもしれません。
マインクラフトからプログラミングに触れた…というケースも耳にします。
投稿者 SSD  (社会人) 投稿日時 2022/11/24 17:46:48
魔界の仮面弁士 様

> えぇと…それは、どういう意味の質問でしょうか?
ネットでメソッドなどを調べたときにC#のサンプルしかない場合があるので、
それを理解できるようになりたいとい意味での質問です。
(今わかるのはVBとSQLだけです。)

> 習得したいのが C# だけなのであれば、C# の前に C を学んでおく必要は無いと思います。
そうなんですね。
ではC#から学んでみようと思います。

話が本題から逸れてしまいました。
ありがとうございました。
投稿者 SSD  (社会人) 投稿日時 2023/3/10 10:31:24
今更ですが自己解決しました。

バインド時に自動生成される列をボタン列にしようとするのではなく、
あらかじめDataGridViewにボタン列を追加してDataPropertyNameに
バインドするオブジェクトのプロパティー名を指定することで実現できました。

以下のような感じです。

Dim grid as New DataGridView
Dim column as New DataGridViewButtonColumn With {
  .Name = "ABC",
  .DataPropertyName = NameOf(MyClass.A)
}
grid.Columns.Add(column)
grid.DataSource = New List(Of MyClassFrom {
  New MyClass With {
    .A = True,
    .B = 123,
    .C = "abc"
  }
}

列の順番を制御したいとなるとバインドするオブジェクトのプロパティーすべてに対応する列をあらかじめ追加しておく必要があるのが少し難点ですが、やりたいことはこれで実現できました。