- PR -

DataGridの初期化について

投稿者投稿内容
マイキー
会議室デビュー日: 2005/05/16
投稿数: 5
投稿日時: 2005-05-16 14:01
はじめまして、マイキーです。
現在、C#.NET(2003)を使用して開発をしてます。(windowsフォーム)

DataGridにてReadOnlyプロパティをtrueに設定しているセルを選択し、
あるボタンをクリック後にDataGridの表示データをクリアする処理を、
記述したのですが、ReadOnlyプロパティをtrueに設定したカラムだけが
選択状態のままグリッドに表示されてしまいます。
どうしたら綺麗にクリアできるのでしょうか。

ロジックは以下のようになってます。
どなたかご教授願えますか。

private void button1_Click(object sender, System.EventArgs e)
{

//スタイル設定

DataGridTableStyle ts = new DataGridTableStyle();
ts.MappingName = "DataTable1";

//カラム1
DataGridTextBoxColumn cs;
cs = new DataGridTextBoxColumn();
cs.MappingName = "No";
cs.HeaderText = "ほげごげ";
cs.Width = 100;
cs.ReadOnly=true;

ts.GridColumnStyles.Add(cs);

//カラム2
DataGridTextBoxColumn cs1;
cs1 = new DataGridTextBoxColumn();
cs1.MappingName = "ZIPCODE";
cs1.HeaderText = "ごげ";
cs1.Width = 200;
cs1.ReadOnly=false;

ts.GridColumnStyles.Add(cs1);

this.dataGrid1.TableStyles.Add(ts);


//データバインド

DataTable dtTable;
DataColumn[] PrimaryColumn = new DataColumn[1];
DataRow dtRow;

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

dtTable.Columns.Add("No", Type.GetType("System.String"));
dtTable.Columns.Add("ZIPCODE", Type.GetType("System.String"));


dtRow = dtTable.NewRow();
dtRow["No"] = "0";
dtRow["ZIPCODE"] = "123-4567";

dtTable.Rows.Add(new object[]{"0行","UID"});
dtTable.Rows.Add(new object[]{"1行","XXXXX"});
dtTable.Rows.Add(new object[]{"2行","XXXXX"});
dtTable.Rows.Add(new object[]{"3行","ST"});

this.dataGrid1.SetDataBinding(dtSet,"DataTable1");

}

private void button3_Click(object sender, System.EventArgs e)
{
this.dataGrid1.DataSource=null;

}

[ メッセージ編集済み 編集者: マイキー 編集日時 2005-05-17 15:16 ]
黒コアラ
常連さん
会議室デビュー日: 2004/07/03
投稿数: 23
投稿日時: 2005-06-14 19:28
空databindするというのはどうでしょうか?
マイキー
会議室デビュー日: 2005/05/16
投稿数: 5
投稿日時: 2005-06-15 10:35
お返事ありがとうございます。
黒コアラさんから教えていただいた空databindをしてみました。
しかし、readonlyの個所は残骸が残ってしまします。
やはり無理なのでしょうか?
記述した内容はこうです。

private void button3_Click(object sender, System.EventArgs e)
{
DataSet dtSet = new DataSet();
DataTable dtTable;
dtTable = dtSet.Tables.Add("DataTable1");

dtTable.Columns.Add("No", Type.GetType("System.String"));
dtTable.Columns.Add("ZIPCODE", Type.GetType("System.String"));

this.dataGrid1.SetDataBinding(dtSet,"DataTable1");
this.dataGrid1.DataSource=null;
}
DH
会議室デビュー日: 2005/03/05
投稿数: 15
投稿日時: 2005-06-15 13:05
readonlyプロパティがTrueになっているカラムをリセットする前に
falseにしてからリセットしてみてはどうでしょうか?

private void button3_Click(object sender, System.EventArgs e)
{
cs.ReadOnly=false;

DataSet dtSet = new DataSet();
DataTable dtTable;
dtTable = dtSet.Tables.Add("DataTable1");

dtTable.Columns.Add("No", Type.GetType("System.String"));
dtTable.Columns.Add("ZIPCODE", Type.GetType("System.String"));

this.dataGrid1.SetDataBinding(dtSet,"DataTable1");
this.dataGrid1.DataSource=null;
}
こんなニュアンスで・・・。
マイキー
会議室デビュー日: 2005/05/16
投稿数: 5
投稿日時: 2005-06-15 14:01
DHサンお返事ありがとうございます。
DHサンがおっしゃる方法も以前に試したのですが駄目でした。

記述内容は以下のとおりです。

DataGridTableStyle ts = new DataGridTableStyle();
ts.MappingName = "DataTable1";

//カラム1
DataGridTextBoxColumn cs;
cs = new DataGridTextBoxColumn();
cs.MappingName = "No";
cs.HeaderText = "ほげごげ";
cs.Width = 100;
cs.ReadOnly=false;

ts.GridColumnStyles.Add(cs);

//カラム2
DataGridTextBoxColumn cs1;
cs1 = new DataGridTextBoxColumn();
cs1.MappingName = "ZIPCODE";
cs1.HeaderText = "ごげ";
cs1.Width = 200;
cs1.ReadOnly=false;

ts.GridColumnStyles.Add(cs1);

this.dataGrid1.TableStyles.Clear();
this.dataGrid1.TableStyles.Add(ts);

DataSet dtSet = new DataSet();
DataTable dtTable;
dtTable = dtSet.Tables.Add("DataTable1");

dtTable.Columns.Add("No", Type.GetType("System.String"));
dtTable.Columns.Add("ZIPCODE", Type.GetType("System.String"));

this.dataGrid1.SetDataBinding(dtSet,"DataTable1");
this.dataGrid1.DataSource=null;

何か記述が間違っているのでしょうか。
簡単に出来るものだと思っていましたが、なかなか出来ないですね
また別の手を考えてみます。
進展があれば報告しますね。
DH
会議室デビュー日: 2005/03/05
投稿数: 15
投稿日時: 2005-06-15 17:05
とりあえず動かしてみないとわからないので動かしてみました。
WindowsフォームということでFormを×1、dataGridを×1ボタンを×2
DataSetを一つ用意してみました。

Form上にDataGridを張り付けて下にボタンを置いただけという
シンプルな画面を作りました。
ボタン1のクリックイベントでDataGridTableStyleとdataSetのテーブルを作成して
最後にSetDataBindingでDataGridに表示させる。
ボタン2のクリックイベント(マイキーさんのところだとbutton3)で
DataSourceをnullにする。

これを作ってみました。結果は
1、ボタン1をクリック→表示成功
2、ボタン2をクリック→削除成功
3、もう一度ボタン1をクリック→this.dataGrid1.TableStyles.Add(ts); ここで
『追加情報 : このデータ グリッドのテーブル スタイル コレクションには
既に同じマップ名のテーブル スタイルが含まれています。』
こんな感じのエラーが発生しました。
のでこんな感じにしてみました。

private void Form1_Load(object sender, System.EventArgs e)
{
//スタイル設定

DataGridTableStyle ts = new DataGridTableStyle();
ts.MappingName = "DataTable1";

//カラム1
DataGridTextBoxColumn cs;
cs = new DataGridTextBoxColumn();
cs.MappingName = "No";
cs.HeaderText = "ほげごげ";
cs.Width = 100;
cs.ReadOnly=true;

ts.GridColumnStyles.Add(cs);

//カラム2
DataGridTextBoxColumn cs1;
cs1 = new DataGridTextBoxColumn();
cs1.MappingName = "ZIPCODE";
cs1.HeaderText = "ごげ";
cs1.Width = 200;
cs1.ReadOnly=false;

ts.GridColumnStyles.Add(cs1);

this.dataGrid1.TableStyles.Add(ts);


//データバインド

DataTable dtTable;
DataColumn[] PrimaryColumn = new DataColumn[1];
DataRow dtRow;

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

dtTable.Columns.Add("No", Type.GetType("System.String"));
dtTable.Columns.Add("ZIPCODE", Type.GetType("System.String"));


dtRow = dtTable.NewRow();
dtRow["No"] = "0";
dtRow["ZIPCODE"] = "123-4567";

dtTable.Rows.Add(new object[]{"0行","UID"});
dtTable.Rows.Add(new object[]{"1行","XXXXX"});
dtTable.Rows.Add(new object[]{"2行","XXXXX"});
dtTable.Rows.Add(new object[]{"3行","ST"});
}

private void button1_Click(object sender, System.EventArgs e)
{
this.dataGrid1.SetDataBinding(dtSet,"DataTable1");
}

private void button2_Click(object sender, System.EventArgs e)
{
this.dataGrid1.DataSource=null;
}
これで一応エラー等は出ないのですが。
同じ現象が発生しないということは足りない項目があると思います。
クリックイベントから処理を外してしまいましたが、これは駄目!とか
他にも注意点ありましたらお願いします。
マイキー
会議室デビュー日: 2005/05/16
投稿数: 5
投稿日時: 2005-06-15 17:32
DHサン

お返事ありがとうございます。
DHサンの記述したとおりにロジックを組んでみました。
ボタン1を押してデータグリッドのほげごげ列の1行という値を選択した状態で、
ボタン2を押したら、他のデータはクリアされるが、
選択した項目は選択された状態のままですね。
DHさんの環境で同じ現象がでないということは.NETのバージョンでしょうか?
ちなみにこちらの環境は
2003 7.1.3091です。
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2005-06-15 20:35
ボタンを押したときに、DataGridのSelect()を読んでみてはどうでしょうか。

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