2017-05-05 13 views
0

私の学校のプロジェクトでは、PostgreSQLデータベースとやりとりできるC#Windows Formsアプリケーションを作成する必要があります。リストボックスを作成しました。これはデータベースからテーブルの名前を取得することになっています。これらの名前を選択すると、そのテーブルのデータがフォームのdatagridviewオブジェクトに表示されます。ただし、リストボックスの値はすべてSystem.Data.DataRowViewであり、datagridviewはリストの最初のテーブルの値のみを表示するという問題があります。Listboxは値の代わりにSystem.Data.DataRowViewを返します

コード:

DataTable tabulusaraksts = new DataTable(); 
    DataTable tabula = new DataTable(); 
    NpgsqlDataAdapter adapter = new NpgsqlDataAdapter(); 
    NpgsqlDataAdapter adapter2 = new NpgsqlDataAdapter(); 
    string tab; 
    public datubaze() 
    { 
     InitializeComponent(); 
     string connectionstring = "Server=localhost;Port=5432;UserId=postgres;Password=students;Database=retrospeles;"; 
     //string connectionstring = String.Format("Server={0};Port={1};" + 
     //  "User Id={2};Password={3};Database={4};", 
     //  serveris.ToString(), port.ToString(), user.ToString(), 
     //  password.ToString(), database.ToString()); 
     NpgsqlConnection ncon = new NpgsqlConnection(connectionstring); 
     NpgsqlCommand listfill = new NpgsqlCommand("select table_name from INFORMATION_SCHEMA.tables WHERE table_schema = ANY (current_schemas(false));", ncon); 
     adapter.SelectCommand = listfill; 
     adapter.Fill(tabulusaraksts); 
     listBox1.DataSource = tabulusaraksts; 
     listBox1.DisplayMember = "table_name"; 
     NpgsqlCommand showtable = new NpgsqlCommand("select * from " + tab +";" , ncon); 
     adapter2.SelectCommand = showtable; 
    } 
public void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     tab = listBox1.GetItemText(listBox1.SelectedItem); 
     adapter2.Fill(tabula); 
     dataGridView1.DataSource = tabula; 
} 

答えて

0

このコードは動作するはずです。私はいくつかのテストデータでそれを試して、ListBoxは正しい値で埋められました。 は確かに、私は最善のアプローチは、ループやLINQのリストを使用してListBoxDataTable行を追加することだと思います

listBox1.DisplayMember = "table_name"; 

ようValueMemberをも設定してみてください。とき私は今、しかし、それは働いた

adapter.SelectCommand = listfill; 
adapter.Fill(tabulusaraksts); 

listBox1.Items.Clear(); 
foreach (DataRow row in tabulusaraksts.Rows) 
{ 
    listBox1.Items.add(tabulusaraksts[0].ToString()); 
} 

NpgsqlCommand showtable = new NpgsqlCommand("select * from " + tab +";" , ncon); 
adapter2.SelectCommand = showtable; 
+0

foreachループを使用して、

adapter.SelectCommand = listfill; adapter.Fill(tabulusaraksts); listBox1.Items.AddRange(tabulusaraksts.AsEnumerable().Select(row => row[0].ToString()).ToArray()); NpgsqlCommand showtable = new NpgsqlCommand("select * from " + tab +";" , ncon); adapter2.SelectCommand = showtable; 

か:DataRowsを通じてtabulusaraksts反復を充填した後、これ(LINQの)のようなDataSource何かを設定せず、ListBoxにアイテムとして追加リストボックスから値を選択しようとすると、エラーが表示されます。エラー:42601:または ";" –

+0

@KristiansKontersは 'adapter2を構築しません。 'tab'はまだ空の文字列であり、リストボックス項目が選択された後にその値を取得するので、' datbuose'メソッドでは 'SelectCommand'を使用します。 'listBox1_SelectedIndexChanged'メソッドで作成します。 – Nino

+0

それは働いて、ありがとう! –

関連する問題