- PR -

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

投稿者投稿内容
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-10-26 20:08
複数のcheckboxをonにした場合、意図通り動きますか?
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-10-27 06:45
引用:

todoさんの書き込み (2004-10-26 20:08) より:
複数のcheckboxをonにした場合、意図通り動きますか?


試してみたところ,ご指摘のように意図通りには動いてくれませんでした。それにいくつかの課題も明らかになりました。以下は,状況説明のために,
  「住所録テーブル/フィールド」
  <生徒ID><番号><入学年度><年><組><No><氏名><フリガナ><性>
  「選択したデータセット」
  <生徒ID><番号><年><組><No><氏名><フリガナ><性>
  「DataGridに表示する列」
  <番号><年><組><No><氏名><フリガナ><性>
  「1から7のCheckBoxのText」
  <番号><年><組><No><氏名><フリガナ><性>
  デザイン時に,すべてのCheckBoxをオンにしてあります。
≪不具合@≫
1 「年」をオフにすると,
  <番号><組><No><氏名><フリガナ><性>
2 1に続けて「組」をオフにすると,
  <番号><組><氏名><フリガナ><性>
≪不具合A≫
1 「性」をオフにしてから,他のいずれかをオフにすると,
 次のエラーが生じます。
    'System.IndexOutOfRangeException' のハンドルされていない例外が
    system.data.dll で発生しました。

   追加情報 : 列 8 が見つかりません。
≪@への対処策≫
NAL-6295さんに教えていただいた,
   obj.Columns.Remove(DataColumnオブジェクト)
と,することでうまく行くような気がしています。
≪Aへの対処策≫
if文をもう少し厳密にしなければと思ってます。
≪新たな課題≫
2つのComboBoxで,学年と組を抽出しますがCheckBoxのオン/オフのあとでは,
うまく機能してくれません。
    dataGrid1.DataSource = dtMeibo;
これの切り替えをするのかな?と思ってますが,対策は全くなし!。勉強のしなきゃ。

アドバイスお待ちしています。
コード:
private void cmbNen_TextChanged(object sender, System.EventArgs e)
{
    DataRead();
}
private void cmbKumi_TextChanged(object sender, System.EventArgs e)
{
    DataRead();
}
private void DataRead()
{
    string Nen, Kumi;

    Nen = cmbNen.Text.Substring(0,1);
    Kumi = cmbKumi.Text.Substring(0,1);
    dsMeibo1.Clear();
    odaMeibo.SelectCommand.Parameters["年"].Value = Nen;
    odaMeibo.SelectCommand.Parameters["組"].Value = Kumi;
			
    odaMeibo.Fill(dsMeibo1, "生徒名簿");
}


とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-10-27 08:33
おはようございます。

チェックボックスがチェックされる度にDataTableの列を削除したり、DataTableをコピーしたり、という方向でされているところに水を差すようですが・・。

もし僕なら、列の表示・表示だけならDataGridTableStyleを使用します。
DataGridTableStyleなら列の幅やヘッダーのテキストなんかも簡単に設定できますし・・。

最初に元になるデータを呼出して、DataGridにDataGridTableStyleを適用して、
チェックボックスがチェックされたらDataGridTableStyleでその列の列幅を0にします。

チェックを外すと元に戻す。実際に僕はこの方法をやってます。DataGridの横幅が限られて、
全ての列を表示するとデザイン的に無理があるので、普段は隠しておいて(列幅を0にして)
チェックボックスをチェックした時だけその列を表示しています。

で、エクスポートする時だけ元になったDataTableをチェックボックスでチェックされた列
のデータのみを別のDataTableにコピーして、それをエクスポートの元ソースにするとか・。
まあ、わざわざコピーしなくてもいいかもしれませんが・・。

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

引用:

もし僕なら、列の表示・表示だけならDataGridTableStyleを使用します。
DataGridTableStyleなら列の幅やヘッダーのテキストなんかも簡単に設定できますし・・。

最初に元になるデータを呼出して、DataGridにDataGridTableStyleを適用して、
チェックボックスがチェックされたらDataGridTableStyleでその列の列幅を0にします。




実はDataGridTableStyleを用いた場合でも、DataGridTableStyle中のGridColumnStyleに割り当てられた項目が存在しないと自動的に非表示になります。
で、その件については、かなり前のレスで説明済みであり、当初列幅を0にする方法での解決は求めていないという事でした。

#一応、状況説明だけ・・・

_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-10-27 10:00
引用:

NAL-6295さんの書き込み (2004-10-27 09:43) より:

実はDataGridTableStyleを用いた場合でも、DataGridTableStyle中のGridColumnStyleに割り当てられた項目が存在しないと自動的に非表示になります。
で、その件については、かなり前のレスで説明済みであり、当初列幅を0にする方法での解決は求めていないという事でした。




こんにちは。

もちろんGridColumnStyleに割り当てられた項目が存在する事が前提で、最初に一度だけDataTableの作成と列の定義を行い、チェックボックスのOn/Offで列の削除等は行わない
事を前提でのご提案です。

>当初列幅を0にする方法での解決は求めていないという事でした。
それは僕は知りませんでした・・。僕もこの方がお考えになる方法で解決されれば、
と思っていますので、ちょっとした提案でした^^

[ メッセージ編集済み 編集者: とっと 編集日時 2004-10-27 10:01 ]
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-10-27 17:12
ZEN73です。
すべてがうまくいきました。ComboBoxでの学年・組の抽出にもきちんと動作しています。
NAL-6295さん,とっとさん,todoさん,ありがとうございました。
特にNAL-6295さんの私の質問に対する即座のアドバイスがなければ,ここまで考え続けることはなかったと思います。これからもよろしくお願いします。
引用:

とっとさんの書き込み (2004-10-27 08:33) より:
もし僕なら、列の表示・表示だけならDataGridTableStyleを使用します。
DataGridTableStyleなら列の幅やヘッダーのテキストなんかも簡単に設定できますし・・。


引用:

NAL-6295さんの書き込み (2004-10-27 09:43) より:
実はDataGridTableStyleを用いた場合でも、DataGridTableStyle中のGridColumnStyleに割り当てられた項目が存在しないと自動的に非表示になります。


 実は,「SQL読み込み」へのこだわりをずうっと持っていたのですが,今まで教えていただいた方法での「抽出」への対応が完全にお手上げ状態になたことで,NAL-6295さんがご指摘のDataGridTableStyle中のGridColumnStyleをいじってみたところ,何とか形にすることができました。
 課題はここからExcelへのエクスポートがうまくいくかどうかです。
コード:
private void arrayCBox_ChekedChanged(object sender, EventArgs e)
{
    string str;
    str = ((System.Windows.Forms.CheckBox) sender).Text;
    switch(str)
    {
        case "番号" : str="生徒No";   break;
        case "年"   : str="年";       break;
        case "組"   : str="組";       break;
        case "No" : str="番号";     break;
        case "氏名" : str="氏名";     break;
        case "フリガナ": str="フリガナ";    break;
        case "性"   : str="性別";     break;
    }
    CBoxText = str;
    SQL_String();
}
private void SQL_String()
{
    string[] ColName;
    string Select = "";
    dataGrid1.TableStyles.Clear();
    DataGridTableStyle tsMeibo = new DataGridTableStyle();
    tsMeibo.MappingName = "生徒名簿";
		
    ColName = new string[8];

    if(checkBox1.Checked)
    {
        ColName[1] = ",生徒No ";
			
        DataGridColumnStyle TextCol11 = new DataGridTextBoxColumn();
        TextCol11.MappingName = "生徒No";
        TextCol11.HeaderText = "番号";
        TextCol11.Width = 34;
        TextCol11.Alignment = HorizontalAlignment.Center;
        TextCol11.NullText = "";
        tsMeibo.GridColumnStyles.Add(TextCol11);
    }
    else 
        ColName[1] = "";
    if(checkBox2.Checked)
    {
        ColName[2] = ",年 ";
		
        DataGridColumnStyle TextCol12 = new DataGridTextBoxColumn();
        TextCol12.MappingName = "年";
        TextCol12.HeaderText = "年";
        TextCol12.Width = 18;
        TextCol12.Alignment = HorizontalAlignment.Center;
        TextCol12.NullText = "";
        tsMeibo.GridColumnStyles.Add(TextCol12);
    }
    else 
        ColName[2] = "";

    ………
    if(checkBox7.Checked)
    {
        ColName[7] = ",性別";
        DataGridColumnStyle TextCol17 = new DataGridTextBoxColumn();
        TextCol17.MappingName = "性別";
        TextCol17.HeaderText = "性";
        TextCol17.Width = 22;
        TextCol17.Alignment = HorizontalAlignment.Center;
        TextCol17.NullText = "";
        tsMeibo.GridColumnStyles.Add(TextCol17);
    }
    else
        ColName[7] = "";
    dataGrid1.TableStyles.Add(tsMeibo);

    for(int i=1; i<8; i++)
    {
        Select += ColName[i];
    }
    this.oleDbSelectCommand1.CommandText = "SELECT 生徒ID" + Select + 
            " FROM 生徒名簿 WHERE (年 = ?) AND (組 = ?) ORDER BY 生徒No";
    DataRead();        
}


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