- PR -

変更したSQL文で,DataGridの特定の列を表示/非表示に切り替えたい(できた)

投稿者投稿内容
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-10-23 17:41
zen73です。
 データを印刷したいと思っています。印刷したくない列の幅を0にすれば,その列は見えくなり,そのDataDridを印刷すれば,思い通りのプリントができます。
 しかし,データをExcelに渡して印刷することもしたいので,特定の列の表示/非表示
をChekBoxによって切り替えたいのですが,うまくいきません。
 初めから表示したくない列を選択しなければいいのですが,アプリを使用する人の意志に任せたいと思い,下のようなコードを書いてみました。チェックボックスはすべて,あらかじめチェックしておきました。
 ぜんぜんうまくはいきませんでした。
 [フリガナ]のチェックをはずすと,表示されていたフリガナがすべて,Nullに変わり,その後,
 [フリガナ]をチェックすると,もとのフリガナが表示されます。

質問1 特定の列の表示/非表示はどのようなコードで実現できるのでしょうか?
質問2 5つのCheckBoxの対応を並べてかいていますが,CheckBoxが10個あっても
    同じようなことをするのでしょうか。(VBは配列が使えて便利!)
よろしくお願いします。


コード:
#!/usr/bin/perl 

this.oleDbSelectCommand1.CommandText =
            "SELECT 番号, 氏名, [フリガナ], 電話, 住所 FROM 住所録";

private void FrmMeibo_Load(object sender, System.EventArgs e)
{
DataRead();
}
private void DataRead()
{
DataSet1.Clear();
oleDbDataAdapter1.Fill(DataSet1, "住所録");
}
private void SQL_String()
{
string[] ColName;
string Select = "";

ColName = new string[6];
if(checkBox1.Checked) ColName[1] = " 番号"; else ColName[1] = "";
if(checkBox2.Checked) ColName[2] = ",氏名 "; else ColName[2] = "";
if(checkBox3.Checked) ColName[3] = ",[フリガナ] "; else ColName[3] = "";
if(checkBox4.Checked) ColName[4] = ",電話 "; else ColName[4] = "";
if(checkBox5.Checked) ColName[5] = ",住所 "; else ColName[5] = "";
for(int i=1; i<5; i++)
{
Select += ColName[i];
}
this.oleDbSelectCommand1.CommandText = "SELECT " + Select + " FROM 住所録";
DataRead();
}
private void checkBox1_CheckedChanged(object sender, System.EventArgs e)
{
SQL_String();
}
private void checkBox2_CheckedChanged(object sender, System.EventArgs e)
{
SQL_String();
}
private void checkBox3_CheckedChanged(object sender, System.EventArgs e)
{
SQL_String();
}
private void checkBox4_CheckedChanged(object sender, System.EventArgs e)
{
SQL_String();
}
private void checkBox5_CheckedChanged(object sender, System.EventArgs e)
{
SQL_String();
}




[ メッセージ編集済み 編集者: ZEN73 編集日時 2004-10-23 17:56 ]

[ メッセージ編集済み 編集者: ZEN73 編集日時 2004-10-27 18:20 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-10-23 17:55
質問1の回答:
[DataGrid].Columns(index).Visible = {true|false}
質問2の回答:
CheckBoxListを利用すると良いかも。
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-10-23 19:35
引用:

ZEN73です。
NAL-6295さんの書き込み (2004-10-23 17:55) より:
質問1の回答:
[DataGrid].Columns(index).Visible = {true|false}
質問2の回答:
CheckBoxListを利用すると良いかも。


質問1の回答が,私には理解できません。.Columnsの[DataGrid]は何なのか?!
○dataGrid1ではないし,○DataSet1 ds = new DataSet1()のdsからもVisibleは出てこないし,
 差し支えありませんでしたら,もう少し詳しくお教え願えませんでしょうか。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-10-23 23:50
言葉足らずでしたか?

[DataGrid]は
System.Web.UI.WebControls.DataGrid型の変数を便宜的にそう表現しました。

ちなみに、ColumnsはMSDNで上記の型の欄を見ると説明が載っているはずです。
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-10-24 12:57
 読んでみましたが,ASP.NETが中心の内容で60をすでに越えている私の頭では,理解不可能です。それに.Visible={TRUE|FALSE}を,TextBoxなどと同様に単に見えなくするだけで削除はしないじゃないか?というのは私の読み間違えなのでしょうか。
 せっかく教えていただいたのにどうもすみません。
 私のしたいことは,CheckBoxのオフ/オンで,削除したり/元に戻したりを実現させたいのです。
 15年ほど前に,CBuilder(C#Builderではない)でSQL文の再読み込みをしていろいろやっていたものですから,VS.NETでの<列削除><削除列の戻し>をする「SQL文」とその「SQL文の再読み込みの方法」を知りたいのです。むろん,他の方法でもかまいません。
 よろしくお願いします。
 

[ メッセージ編集済み 編集者: ZEN73 編集日時 2004-10-24 13:09 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-10-24 13:36
引用:

質問1 特定の列の表示/非表示はどのようなコードで実現できるのでしょうか?



と仰っていたので、表示・非表示ができるコードを示しました。
また、環境が書かれていなかったので、とりあえずWebFormsを例に挙げました。
つまり・・・

引用:

読んでみましたが,ASP.NETが中心の内容で60をすでに越えている私の頭では,理解不可能です。それに.Visible={TRUE|FALSE}を,TextBoxなどと同様に単に見えなくするだけで削除はしないじゃないか?というのは私の読み間違えなのでしょうか。



というのは、読み間違えではありません。
そういう意図で返答しました。

で、実際には何を知りたいのですか?
DataGridの事を聞きたいのですか?
SQL文の事を聞きたいのですか?
あなたの環境は?
WebForms?WindowsForms?
ちなみに、WindowsFormsの場合だと、うちでは、取得した項目だけが表示されるようになります。
取得するたびにデータグリッドのDataSourceにDataTableを代入するようにしています。

ちなみに、SQL_String()というメソッドに不具合があるようですよ。
CheckBox1がチェックされていないと、実行できないSQL文になります。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-10-24 13:39 ]

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-10-24 13:42 ]

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-10-24 13:50 ]
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-10-24 15:36
NAL-6295さん,貴重な時間を割いていただきありがとうございます。
引用:

と仰っていたので、表示・非表示ができるコードを示しました。


これは,<削除・復活>と書くべきでした。

引用:

で、実際には何を知りたいのですか?
DataGridの事を聞きたいのですか?
SQL文の事を聞きたいのですか?
あなたの環境は?
WebForms?WindowsForms?


 WindowsFormsです。
 お聞きしたいのは,≪新たなSQL文でDataGridにデータを再セットする方法≫です。
 間違いがありましたけど,必要なSQL文はこの1つでいいと思ってます。

引用:

ちなみに、WindowsFormsの場合だと、うちでは、取得した項目だけが表示されるようになります。
取得するたびにデータグリッドのDataSourceにDataTableを代入するようにしています。


「住所録」は,質問のために例示したものです。実際には列の並びが決まっていて,列数も10を超えていますので常に<削除⇔戻し>ができるようにということで,SQL文で考えてみたのです。
 どうぞよろしくお願いします。

NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-10-24 16:06
NAL-6295です。

[デザイン時]
DataGridのTableStylesプロパティ中にある
GridColumnStylesを取得するデータとバインドできる形に設定し、
[実行時]
SQLでデータを取得した後、
表示したいDataTableをCopyし
↓例
コード:
  Dim obj as DataTable
  obj = [DataSetオブジェクト].[該当のDataTableオブジェクト].Copy()


CheckBoxに合わせて、不必要な項目をDataTableから削除

コード:
obj.Columns.RemoveAt(Index)
または
obj.Columns.Remove(DataColumnオブジェクト)


してあげた上で、
DataGridのDataSourceに設定してあげれば、そのように動作します。
表示する項目を変化させる度に既に取得しているDataSetからDataTableをコピーすることで、毎回SQLを発行しなくても、項目の表示が変わると思います。

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