none
Form1_Loadイベントでデータを表示するには? RRS feed

  • 質問

  • VC# 2010 Proで下記のコードでForm1のロード時にPostgreSQLのレコードを表示させようと思いますが
    デバッグは正常にとおるものの、やり方が間違っているのか表示してくれません。

    そもそもLoadイベントでやろうとしているのが間違っているのか?
    どのようにするべきなのか、教えてください。お願いいたします。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Npgsql;
    using Mono;
    using System.Data.SqlClient;

    namespace PostgreSQLTEst
    {
        public partial class Form1 : Form
        {
            private DataSet ds = new DataSet();
            private DataTable dt = new DataTable();

            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                try
                {

                    NpgsqlConnection conn = new NpgsqlConnection("Server=192.168.0.30;Port=5432;User Id=user;Password=pass;Database=db;Encoding=UNICODE");

                    conn.Open();

                    NpgsqlDataAdapter das = new NpgsqlDataAdapter();

                    das.SelectCommand = new NpgsqlCommand("SELECT * FROM users ORDER BY id", conn);

                    ds.Reset();

                    das.Fill(ds);

                    dt = ds.Tables[0];

                    BindingSource bindingSource1 = new BindingSource();
                    bindingSource1.DataSource = dt;
                    bindingNavigator1.BindingSource = bindingSource1;
                    dataGridView1.DataSource = bindingSource1;
                    dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;


                    conn.Close();
                }
                catch (Exception msg)
                {
                    // something went wrong, and you wanna know why
                    MessageBox.Show(msg.ToString());
                    throw;
                }
           }

        }
    }
            }
    2010年7月13日 22:48

回答

  • ありがとうございます。 同じコードをbottun1_Clickイベントで書くと 表示されるので、
    であれば、Form1のLoadイベントにForm1_Loadが割り当てられていないかもしれませんね。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク oira3ryu 2010年7月14日 10:32
    2010年7月14日 2:22
    モデレータ

すべての返信

  • エラーは出ないけどグリッドに表示できないってことでしょうか。

    とりあえず
    > dt = ds.Tables[0];
    でブレークポイントでとめて内容が入っているか確認するのがよいと思います。
    もし内容が意図したものが入っていれば
    dataGridView1.DataSource =  dt;
    だけで表示できるかと思います。

    2010年7月14日 0:17
  • dataGridView1の列に関する設定の可能性もあります。例えばdataGridView1.AutoGenerateColumnsがfalseになっていて、かつ、手動で列が全く追加されていないのかもしれません。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年7月14日 1:37
    モデレータ
  • mars12さん、こんにちは、

    エラーは出ないけどグリッドに表示できないってことでしょうか。

    そうなのです。同じコードをbottun1_Clickイベントで書くと 表示されるのですが...

    とりあえず

    > dt = ds.Tables[0];

    でブレークポイントでとめて内容が入っているか確認するのがよいと思います。

    もし内容が意図したものが入っていれば

    dataGridView1.DataSource = dt;

    だけで表示できるかと思います。

    ありがとうございます。 いま、手元に環境が無いので今晩家に帰ってから試してみます!
    2010年7月14日 2:16
  • trapemiyaさん、こんにちは、
    dataGridView1の列に関する設定の可能性もあります。例えばdataGridView1.AutoGenerateColumnsがfalseになっていて、かつ、手動で列が全く追加されていないのかもしれません。

    ありがとうございます。 同じコードをbottun1_Clickイベントで書くと 表示されるので、 dataGridView1.AutoGenerateColumnsがtrueだと思うのですが いま、手元に環境が無いので今晩家に帰ってから試してみます!
    2010年7月14日 2:19
  • ありがとうございます。 同じコードをbottun1_Clickイベントで書くと 表示されるので、
    であれば、Form1のLoadイベントにForm1_Loadが割り当てられていないかもしれませんね。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク oira3ryu 2010年7月14日 10:32
    2010年7月14日 2:22
    モデレータ
  • ちょっと本題から外れます。

    個人的な好みの問題でもありますが、Loadイベントは好きではありません。
    データの読み込みエラーが発生したとしても、Form.Show()が開始されているため何が何でもFormを表示する必要があるからです。

    書かれているコードもMessageBoxを表示した後、Formが出てくるわけで(まぁrethrowされていますが)。

    なので個人的にはコンストラクタやForm.Show()呼び出し前にデータ取得はしたいと思っています。

    2010年7月14日 2:24
  • であれば、Form1のLoadイベントにForm1_Loadが割り当てられていないかもしれませんね。

    えっ(汗; VC#のイベントって割り当てなければ動かないものなのですか? 触って間もないもので、そんなことも知らないでやってました... 帰ったら、その割り当て方から早速調べてみます!
    2010年7月14日 2:31
  • 佐祐理さん、こんにちは、

    なので個人的にはコンストラクタやForm.Show()呼び出し前にデータ取得はしたいと思っています。

    すいません。私にはまだ高度すぎておっしゃっていることがよく理解できませんが VBAとかとは違ってそういうことができるのですね。参考にさせていただきます。
    2010年7月14日 2:34
  • かなりレスが付いてますが・・・

    > そもそもLoadイベントでやろうとしているのが間違っているのか?

    これはデータの表示的には全く問題ないですね。もちろん佐祐理さんの指摘されている問題はありますが。

    あとmars12さんの指摘されておられるように、余分な処理が入っているようなので、以下のようにコードを縮めることが可能です。あとコネクションの接続を閉じるのは finally ブロックで行うべきだと思います。

    NpgsqlConnection conn = new NpgsqlConnection
     ("Server=192.168.0.30;Port=5432;User Id=user;Password=pass;Database=db;Encoding=UNICODE");
    try {
     conn.Open();
     NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM users ORDER BY id", conn);
     NpgsqlDataAdapter das = new NpgsqlDataAdapter(command);
     DataTable dt = new DataTable();
     das.Fill(dt);
     dataGridView1.DataSource = dt;
    } catch (Exception ex) {
     MessageBox.Show(ex.ToString());
     throw;
    } finally {
     conn.Close();
    }
    

    ひらぽん http://d.hatena.ne.jp/hilapon/
    2010年7月14日 3:12
    モデレータ
  • ひらぽんさん、こんにちは、
    Loadイベントでのデータ表示の件については、問題もふくめて理解しました。

    > あとmars12さんの指摘されておられるように、余分な処理が入っているようなので、以下のようにコードを縮めることが可能です。 
    とありますが、掲示していただいたコードではbindingNavigatorの処理部分を抜いていますが
    これ↓は、別なイベントに書いて処理すべきということなのでしょうか?

    BindingSource bindingSource1 = new BindingSource();
    bindingSource1.DataSource = dt;
    bindingNavigator1.BindingSource = bindingSource1;

    ちょっと、今、実行環境が手元に無いのですが(自宅に帰らないと...)
    気になったもので脱線かもしれませんが質問させていただきました。

    2010年7月14日 4:01
  • すみません。回答の候補、押し間違えました。<(_ _;)>

    #なんか表示がおかしい・・・

    > 掲示していただいたコードではbindingNavigatorの処理部分を抜いていますが
    > これ↓は、別なイベントに書いて処理すべきということなのでしょうか?

    > BindingSource bindingSource1 = new BindingSource();
    > bindingSource1.DataSource = dt;
    > bindingNavigator1.BindingSource = bindingSource1;


    なぜか見落としてました。ケアレスミスです。忘れて下さい・・・<(_ _;)>

    ひらぽん http://d.hatena.ne.jp/hilapon/
    2010年7月14日 6:43
    モデレータ
  • ご指摘どおり  

     デザイン画面のForm1プロパティの雷マークでLoadをForm1_Loadにして

    デバッグして実行すると、データが表示されるようになりました。

    (あとで考えてみるとVBAとかのイベントプロシージャと同じかんじなのですね。)

    こんなことがわからないなんて恥ずかしいです。

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

    2010年7月14日 10:47