DOBON.NET DOBON.NETプログラミング掲示板過去ログ

「DataGrid内の特定のセルの色を変える」について

分類:[.NET]

はじめまして、.NET初心者です。
「DataGrid内の特定のセルの色を変える」を見させていただいて何度も挑戦しているのですがなぜかうまく動かず列スタイルのところが原因かPaintメソッドのところが原因か全く分からなくなってしまいました・・・。

動作をさせるとTableStyleに列スタイルを追加したところで「データ グリッドの列スタイル コレクションには、既に同じマップ名の列スタイルが含まれています。」とエラーが出てしまうのですが解説をみると「データソースが"Column1"という名前のDatacolumnがあることが前提」とありますので同様に記述をしているのですがエラーの原因としてはcsのMappingNameで"Column1"を指定しているのが原因と思われついに頭をかかえてしまいました・・・

一応詳しくご説明させていただく為に試験的にかいてる最低限のコードです。

Dim dtSet As DataSet = New DataSet("Ds")
Dim dtTable As DataTable
Dim ts As New DataGridTableStyle()
Dim dCol As DataColumn

dtTable = dtSet.Tables.Add("DataTable1")

dCol = _
dtTable.Columns.Add("Column1", Type.GetType("System.String"))
dtTable.PrimaryKey = New DataColumn() {dCol}

DataGrid1.SetDataBinding(dtSet, "DataTable1")

ts.MappingName = "DataTable1"
DataGrid1.TableStyles.Add(ts)

Dim cs As DataGridTextBoxColumn
cs = New DataGridTextBoxColumn()

cs.MappingName = "Column1"
cs.Width = 300

ts.GridColumnStyles.Add(cs)

DataGrid1.TableStyles.Add(ts)

低次元な悩みでしたら申し訳ございませんがどうにもならない状態になってしまいましたのでお分かりになる方がいらっしゃいましたらご教授頂けないでしょうか。
失礼致します。
■No580に返信(むさしさんの記事)

多分

DataGrid1.TableStyles.Add(ts)

の位置に問題があるのではないでしょうか?このことについては、

DataGridの列の幅を変更する
http://dobon.net/vb/dotnet/datagrid/columnwidth.html

で説明しています。

(この時は、MappingName値が重複する...

の部分です。
管理人さんご回答ありがとうございます。

DataGrid1.TableStyles.Add(ts)
についてはなぜは中盤と最終行の2行あったため中盤の方を消したところWidthやHeaderTextの反映はできました。

しかしメインの問題であるMyDataGridTextBoxColumnクラスのPaintメソッドをオーバーライドしてセルの色を変えられませんでした・・・。
MyDataGridTextBoxColumnクラスにいたってはそのままコピーして実行して"0"を入力したセルを用意しても音沙汰なしです。

クラスの扱いに慣れていないのでもしかするとなにか足りないコードがあるのかなともおもいますがなに分初心者なもので・・・。
もしなにか足りないようでしたらご指摘いただけると幸いです。
■No605に返信(むさしさんの記事)
> もしなにか足りないようでしたらご指摘いただけると幸いです。

そう言われましても、コードが分からないため、指摘のしようがありません。No580のコードではMyDataGridTextBoxColumnクラスが使われていませんし。
管理人さん再度ご回答ありがとうございます。

>No580のコードではMyDataGridTextBoxColumnクラスが使われていませんし。
最初おっしゃっている意味が分かりませんでしたがよく見直したら確かに使われていない事に気付きました。
言い訳になってしまいますが悩んでいるときに一度もとのDataGridTextBoxColumnクラスcsに使っては・・・という事をやったままになっていました・・・
結論から言うと実行できました!ありがとうございます。

ベタな間違いでお恥ずかしいかぎりですがクラスの考え方の間違いでない事が確認でき、更に改めてプログラマーとしての基本的な間違いを思い出すことができました。

一応同様の悩みを持っている方のために結果的なコードを書いておきます。
(MyDataGridTextBoxColumnクラスはそのままコピーしてできる状態です)

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

Dim dtSet As DataSet = New DataSet("Ds")
Dim dtTable As DataTable
Dim ts As New DataGridTableStyle()
Dim dCol As DataColumn

dtTable = dtSet.Tables.Add("DataTable1")

dCol = _
dtTable.Columns.Add("Column1", Type.GetType("System.String"))
dtTable.PrimaryKey = New DataColumn() {dCol}

DataGrid1.SetDataBinding(dtSet, "DataTable1")

ts.MappingName = "DataTable1"

dtTable.Rows.Add(New Object() {"0"})
dtTable.Rows.Add(New Object() {"1"})
dtTable.Rows.Add(New Object() {"2"})

Dim cs As MyDataGridTextBoxColumn
cs = New MyDataGridTextBoxColumn()

cs.MappingName = "Column1"
cs.HeaderText = "Col1"
cs.Width = 300

ts.GridColumnStyles.Add(cs)

DataGrid1.TableStyles.Add(ts)

End Sub
End Class

これを応用し座標を指定して色を変えられるようにしたいと思います。
今回は本当にありがとうございました。m(_ _)m
失礼致します。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板