none
DataGridViewで表の切り替え RRS feed

  • 質問

  • Windowsフォームアプリケーションについてです。

    TreeViewとDataGridViewを使ってデータを表にまとめるプログラムを作っております。

    TreeViewの項目はプログラムから自動生成され、DataGridViewのデータはユーザから入力されます。

    DataGridViewのコントロールは一つだけです。

    TreeViewで項目を選択し、その項目に対応したデータをDataGridViewへ表示するにはどうすればいいでしょうか?

     

    2011年12月1日 5:43

回答

  • >今回行おうとした事は、表全体を変数へ格納し、再度呼び出して表示という事です。

    まず、「表」という言葉を使うのをやめましょう。DataGridView のことを言っているのか、それに表示する値の集合を言っているのかわかりません。

     

    >コントロール自体は一つだけです。

    これも、「コントロール」ではなく「DataGridView」と明示してください。

     

    フォームデザイナーに表示されているフォームに DataGridView は配置しましたか?それは一つだけですか?

    たとえばその DataGridView の Name が dataGridView1 だったとして、

     

    void ShowData(string key)
    
    {
    
        this.dataGridView1.Rows.Clear();
    
        (var rowValues in GetData(key))
        {
    
            // 新しい行のインデックス
            int rowIndex = dataGridView1.Rows.Add();
    
            // 新しい行に対してデータを割り当てる。
            ...
        }
    }
    
    

    というような感じで、何かの値(この場合は string key)を元に DataGridView を表示内容を更新するメソッドを作ることは可能ですか?

    • 回答としてマーク egrg 2011年12月15日 5:04
    2011年12月6日 3:34

すべての返信

  • まず、今どこまでできているのかを書いてください。

     

    TreeView の AfterSelect イベントで選択された Node を知ることができます。

    それを元に DataGridView の表示を書き換えます。

     

    2011年12月1日 7:11
  • ・TreeViewでツリーの生成

    ・DataGridViewで行列の追加(表フォーマットの生成)

    以上二つが完成していますが、ご指摘のTreeViewのAfterSelectイベントハンドラだけが思いつきません。

    dgv = new DataGridView[10]
    ・
    ・
    ・
            private void trv_AfterSelect(object sender, TreeViewEventArgs e)
            {
                DataGridView = dgv[trv.SelectedNode.Index];
                DataGridView.Show();
            }
    

    のようにやってみたものの駄目でした。

     

    2011年12月2日 4:56
  • > dgv = new DataGridView[10]
    ツリーノードの数だけデータグリッドビューを用意するのですか?
    DataGridView は一つだけではないのですか?
    選択されたノードの情報を元にツリービューの行を作っていきます。
    private void trv_AfterSelect(object sender, TreeViewEventArgs e)
    {
        //DataGridVew の行をクリア
        this.dgv.Rows.Clear();
        // e.Node を元に DataGridVew の行を作成
        ...
    }
    > 駄目でした。
    「駄目でした」ではなく「どう駄目だったのか」を書いてください。

    • 編集済み galaco 2011年12月2日 7:27
    2011年12月2日 6:51
  • > dgv = new DataGridView[10]

    コントロール自体は一つだけです。

    表の数がノードの数だけあります。(配列の数は適当に書いただけです)

    結果的には間違っていますが、コントロールに表示されている表をインスタンス化したつもりです。


     > 駄目でした。

    ノードをクリックしてもDataGridViewの表示が切り替わりませんでした。

    2011年12月5日 4:45
  • インスタンスの意味、理解されていますか。
    コントロールの意味も取り違えて使っているような気がします。
    >ノードをクリックしてもDataGridViewの表示が切り替わりませんでした。

    その際、例外は発生していませんか。

     

    >結果的には間違っていますが、コントロールに表示されている表をインスタンス化したつもりです。

    いいえ、インスタンス化できていません。

    このコードを正しく動かすには、dgv配列の各要素に「インスタンス化」されたDataGridViewコントロールが必要です。
    それらはFormの子コントロールであり、各プロパティも正しく値が設定されている必要があるでしょう。
    これらの初期化は済んでいますか。

    そして、新しいコントロールを表示する前に、今まで表示されていたコントロールを非表示にする必要もあるでしょう。
     
    #DataGridViewのインスタンスをノードの数だけ用意するよりも、表示するデータだけを切り換える方がスマートだと思いますが。

    2011年12月5日 13:38
  • >インスタンスの意味、理解されていますか。

    申し訳ないのですが、分かっていません。

    C++やマイコン用のC言語を使っているのですが、C#のプログラミングはこれが2回目です。

    本やMSDNのプログラム例を見ながらプログラムしていたのですが、問題部分で詰まってしまいここで質問させていただきました。

     

    >その際、例外は発生していませんか。

    発生していません。

     

    >表示するデータだけを切り換える方がスマートだと思いますが。

    それを行いたいのです。

    今回行おうとした事は、表全体を変数へ格納し、再度呼び出して表示という事です。

    ですが、やはりよく分からないまま止まっています。

    2011年12月6日 2:45
  • >今回行おうとした事は、表全体を変数へ格納し、再度呼び出して表示という事です。

    まず、「表」という言葉を使うのをやめましょう。DataGridView のことを言っているのか、それに表示する値の集合を言っているのかわかりません。

     

    >コントロール自体は一つだけです。

    これも、「コントロール」ではなく「DataGridView」と明示してください。

     

    フォームデザイナーに表示されているフォームに DataGridView は配置しましたか?それは一つだけですか?

    たとえばその DataGridView の Name が dataGridView1 だったとして、

     

    void ShowData(string key)
    
    {
    
        this.dataGridView1.Rows.Clear();
    
        (var rowValues in GetData(key))
        {
    
            // 新しい行のインデックス
            int rowIndex = dataGridView1.Rows.Add();
    
            // 新しい行に対してデータを割り当てる。
            ...
        }
    }
    
    

    というような感じで、何かの値(この場合は string key)を元に DataGridView を表示内容を更新するメソッドを作ることは可能ですか?

    • 回答としてマーク egrg 2011年12月15日 5:04
    2011年12月6日 3:34
  • >何かの値(この場合は string key)を元に DataGridView を表示内容を更新するメソッドを作ることは可能ですか?

    はい、その方法でのコードは完成しています。

    表示データを別に用意した多次元配列へ格納する方法としました。

    ですがC#を使った感覚としてもっと簡潔に書けそうな気がします。

    できないのなら、このまま解決とさせていただきます。

    2011年12月8日 6:56
  • TreeView の 各ノードにキーを持たせます。Text プロパティをそのまま使えるならそれも良いですし、Tag プロパティなら任意を型を入れることもできます。

    そして、AfterSelect イベントハンドラでメソッドを呼び出すだけです。

    private void trv_AfterSelect(object sender, TreeViewEventArgs e)
    {
        ShowData(e.Node.Text);
    
        // Tagプロパティを使う場合
        //ShowData((string)e.Node.Tag);
    }
    
    

    • 編集済み galaco 2011年12月8日 7:09
    2011年12月8日 7:09
  • TreeViewで選択したNodeの内容を分解して、

    DataTableなどに纏めて、DataGridViewにBindすればどうでしょう?

     

    まずは、どうんな動きをする物を作りたいかがわかりませんが。。。

    2011年12月12日 7:54
  • >DataTableなどに纏めて、DataGridViewにBindすればどうでしょう?

    とりあえず現在の方法で収まっていますので、これで終わりにさせていただきます。

    皆様ありがとうございました。

    2011年12月15日 5:02