- PR -

Winアプリ DataGrid の DataGridBoolColumn について

投稿者投稿内容
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-08-10 14:55
Jittaさん、ご返信ありがとうございます。

以下の用にやってみましたが期待した結果が得られませんでした。
もう少しだけ面倒を見てください。

Dim oleCn As New System.Data.OleDb.OleDbConnection
Dim oleDa As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter
Dim ds As DataSet = New DataSet
Dim strSQL As String 'SQL格納用

Dim oleCm As OleDb.OleDbCommand

strSQL = ""
strSQL = strSQL & "SELECT ABC , "
strSQL = strSQL & " BBB " ← Oracle Number型 1 or 0
strSQL = strSQL & " FROM Table "

oleCm = New OleDb.OleDbCommand(strSQL, oleCn)

oleDa.SelectCommand = oraCm

oleDa.Fill(ds, "AAA")

'TableStyle(DataGridの体裁)を定義

Dim TblStyle As New DataGridTableStyle
TblStyle.MappingName = "AAA"

Dim txtAAA As New DataGridTextBoxColumn
txtAAA.MappingName = "ABC"
txtAAA.HeaderText = "ヘッダー"
txtAAA.Width = 120
TblStyle.GridColumnStyles.Add(txtAAA)

Dim chkFlg As New DataGridBoolColumn
chkFlg.MappingName = "BBB"
chkFlg.TrueValue = 1  ← 『1』でチェック
chkFlg.FalseValue = 0
chkFlg.AllowNull = False

chkFlg.HeaderText = "ヘッダーテキスト"
chkFlg.Width = 50
TblStyle.GridColumnStyles.Add(chkFlg)


手間を掛けてすいません。出来の悪い奴でして・・・・。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-10 19:41
Jittaさん。

DataGridBoolColumn.SetColumnValueAtRow メソッドは、
object value が true なら TrueValue ・ false なら FalseValue
DBNull なら NullValue その他なら null で
DataGridColumnStyle.SetColumnValueAtRow メソッド に渡します。

書き忘れました。
override するんだったらこのあたりではないかと思いますが、
この仕様がどこまで波及しているのか調べるのは大変と思っています。

_________________
〜〜〜〜〜〜〜〜
えムナウ
http://www.geocities.jp/mnow
mnow@yahoo.co.jp
〜〜〜〜〜〜〜〜

[ メッセージ編集済み 編集者: えムナウ 編集日時 2004-08-10 20:14 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-10 20:51
 う〜ん、日本語で書いてあることからは、設定にも取得にも、TrueValue/FalseValueに設定した値が使えそうなのですが。。。と、Object?intはObjectから派生していないから?System.Int32ならイケる?
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-10 22:45
出来ちゃいましたね。
コード:

DataSet custDS = new DataSet("CustomerOrders");
DataTable ordersTable = custDS.Tables.Add("Orders");
DataColumn pkCol = ordersTable.Columns.Add("OrderID", typeof(Int32));
ordersTable.Columns.Add("CompanyName", typeof(string));
ordersTable.Columns.Add("Enable", typeof(Int32));
custDS.Tables["Orders"].LoadDataRow(new Object[] {1,"AAA",1},true);
custDS.Tables["Orders"].LoadDataRow(new Object[] {2,"BBB",0},true);

dataGrid1.DataSource = custDS;
dataGrid1.DataMember = "Orders";
dataGrid1.TableStyles.Add(new DataGridTableStyle());

CurrencyManager cm = (CurrencyManager)this.BindingContext[custDS.Tables["Orders"]];

DataGridTextBoxColumn myColumnTextColumn;
PropertyDescriptor pd1 = cm.GetItemProperties()["OrderID"];
myColumnTextColumn = new DataGridTextBoxColumn(pd1);
myColumnTextColumn.MappingName = "OrderID";
myColumnTextColumn.HeaderText = "OrderID";
dataGrid1.TableStyles[0].GridColumnStyles.Add(myColumnTextColumn);

PropertyDescriptor pd2 = cm.GetItemProperties()["CompanyName"];
myColumnTextColumn = new DataGridTextBoxColumn(pd2);
myColumnTextColumn.MappingName = "CompanyName";
myColumnTextColumn.HeaderText = "CompanyName";
dataGrid1.TableStyles[0].GridColumnStyles.Add(myColumnTextColumn);

DataGridBoolColumn myColumnBoolColumn;
PropertyDescriptor pd3 = cm.GetItemProperties()["Enable"];
myColumnBoolColumn = new DataGridBoolColumn(pd3);
myColumnBoolColumn.MappingName = "Enable";
myColumnBoolColumn.HeaderText = "Enable";
myColumnBoolColumn.TrueValue = 1 ;
myColumnBoolColumn.FalseValue = 0 ;
myColumnBoolColumn.AllowNull = false ;

dataGrid1.TableStyles[0].GridColumnStyles.Add(myColumnBoolColumn);
dataGrid1.TableStyles[0].MappingName = "Orders";



_________________
〜〜〜〜〜〜〜〜
えムナウ
http://www.geocities.jp/mnow
mnow@yahoo.co.jp
〜〜〜〜〜〜〜〜

[ メッセージ編集済み 編集者: えムナウ 編集日時 2004-08-10 23:02 ]
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-10 22:54
CurrencyManager がちょっと変なので削除してみましたが動作しました。
コード:
DataGridTextBoxColumn myColumnTextColumn;
myColumnTextColumn = new DataGridTextBoxColumn();
myColumnTextColumn.MappingName = "OrderID";
myColumnTextColumn.HeaderText = "OrderID";
dataGrid1.TableStyles[0].GridColumnStyles.Add(myColumnTextColumn);

myColumnTextColumn = new DataGridTextBoxColumn();
myColumnTextColumn.MappingName = "CompanyName";
myColumnTextColumn.HeaderText = "CompanyName";
dataGrid1.TableStyles[0].GridColumnStyles.Add(myColumnTextColumn);

DataGridBoolColumn myColumnBoolColumn ;
myColumnBoolColumn = new DataGridBoolColumn();
myColumnBoolColumn.MappingName = "Enable";
myColumnBoolColumn.HeaderText = "Enable";
myColumnBoolColumn.TrueValue = 1 ;
myColumnBoolColumn.FalseValue = 0 ;
myColumnBoolColumn.AllowNull = false ;
dataGrid1.TableStyles[0].GridColumnStyles.Add(myColumnBoolColumn);

dataGrid1.TableStyles[0].MappingName = "Orders";


_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-10 22:57
dataGrid1.TableStyles.Add が無かったという落ちですか?
_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-08-11 08:31
おはようございます。

>dataGrid1.TableStyles.Add が無かったという落ち

ではないです。DataGridTextBoxColumn の部分は上手くいってます。

前の投稿でその部分がなかったみたいですね。すいません。


Dim oleCn As New System.Data.OleDb.OleDbConnection
Dim oleDa As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter
Dim ds As DataSet = New DataSet
Dim strSQL As String 'SQL格納用

Dim oleCm As OleDb.OleDbCommand

strSQL = ""
strSQL = strSQL & "SELECT ABC , "
strSQL = strSQL & " BBB " ← Oracle Number型 1 or 0
strSQL = strSQL & " FROM Table "

oleCm = New OleDb.OleDbCommand(strSQL, oleCn)

oleDa.SelectCommand = oraCm

oleDa.Fill(ds, "AAA")

'TableStyle(DataGridの体裁)を定義

Dim TblStyle As New DataGridTableStyle
TblStyle.MappingName = "AAA"

Dim txtAAA As New DataGridTextBoxColumn
txtAAA.MappingName = "ABC"
txtAAA.HeaderText = "ヘッダー"
txtAAA.Width = 120
TblStyle.GridColumnStyles.Add(txtAAA)

Dim chkFlg As New DataGridBoolColumn
chkFlg.MappingName = "BBB"
chkFlg.TrueValue = 1  ← 『1』でチェック
chkFlg.FalseValue = 0
chkFlg.AllowNull = False

chkFlg.HeaderText = "ヘッダーテキスト"
chkFlg.Width = 50
TblStyle.GridColumnStyles.Add(chkFlg)


'定義したTableStyleをDataGridに適用
datagrid.TableStyles.Clear()
datagrid.TableStyles.Add(TblStyle)

datagrid.DataSource = ds.Tables("AAA")

今回参照した.NET TIPSで列を定義している部分

// テーブルの列を作成
DataSet dataSet1 = new DataSet("商品マスター");
DataTable dataTable1 = dataSet1.Tables.Add("商品テーブル");
DataColumn dataClumn1 = dataTable1.Columns.Add("ID", typeof(int));
DataColumn dataClumn2 = dataTable1.Columns.Add("商品");
DataColumn dataClumn3 = dataTable1.Columns.Add("チェック", typeof(bool));

の記述を僕がしていないからでしょうか?別で参照した雑誌で上記の流れでやってあったのでそちらを参照して、チェックボックスの部分をこちらの.NET TIPSを参照しました。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-11 11:00
>DataColumn dataClumn3 = dataTable1.Columns.Add("チェック", typeof(bool));
bool なら bool でいいじゃん。 int だから苦労しているんじゃなかったのですか?
しかも DataSet と SQL が 対応していないのはなぜですか?
DataSet の項目名と SQL項目名が違うし、個数もちがう、テーブル名も違う。

これはTipsそのままでカスタマイズしていないということですかね。
こんなのが本来いるんですかという質問と捕らえるとあったほうがいいです。
>strSQL = ""
>strSQL = strSQL & "SELECT ABC , "
>strSQL = strSQL & " BBB " ← Oracle Number型 1 or 0
>strSQL = strSQL & " FROM Table "
>oleCm = New OleDb.OleDbCommand(strSQL, oleCn)
>oleDa.SelectCommand = oraCm
>oleDa.Fill(ds, "AAA")
これで自動的に ds に AAA テーブルが作成されますが、ABC・BBB のTypeは未指定ですので暗黙値(実行時の暗黙生成)となります。
未確認ですが両方 string にされているかもしれません。
DataSet の中身は Fill の後で予定どおり string int の順で入っていることを確認されましたか?

>datagrid.DataSource = ds.Tables("AAA")
dataGrid1.DataSource = custDS;
dataGrid1.DataMember = "Orders";
問題は無いとは思いますが一応あげておきます。

あと順序もあわせたほうがいいと思います。
dataGrid1.TableStyles.Add(new DataGridTableStyle());
dataGrid1.TableStyles[0].MappingName = "Orders";
のあたりですね。

私が出来たのですから、とっとさんもきっと出来ます。

_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2

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