2017-05-05 84 views
0

我正在爲我的學校做一個項目,在那裏我必須製作一個C#Windows Forms應用程序,讓我可以與我的PostgreSQL數據庫進行交互。我創建了一個列表框,它應該從我的數據庫中獲取表格的名稱,當我選擇這些名稱時,表格中的數據將顯示在表格中的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填充了正確的值。 可以肯定,儘量還成立ValueMember

listBox1.DisplayMember = "table_name"; 

我認爲最好的辦法是DataTable行添加到您的ListBox使用循環或LINQ名單。通過DataRows填充tabulusaraksts迭代後,並將其作爲項目添加到ListBox,無需設置DataSource像這樣(LINQ):

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; 

,或者使用foreach循環

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

它的工作,但現在當我嘗試從列表框中選擇一個值,它給了我一個錯誤:錯誤:42601:語法錯誤在或接近「;」 –

+0

@KristiansKonters不會構造'adapter2。 ''datubaze'方法中的SelectCommand'因爲'tab'仍然是空字符串,並且在選擇了listbox項目後獲取它的值。在'listBox1_SelectedIndexChanged'方法中創建它。 – Nino

+0

它的工作,非常感謝你! –