2017-05-05 1 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은 정확한 값으로 채워졌다. 은 확실히, 또한 내가 가장 좋은 방법은 당신의 ListBox 사용하여 루프 또는 Linq에 목록에 DataTable 행을 추가하는 것입니다 생각

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 '를 생성하지 않습니다. 'datbuose' 메서드에서'SelectCommand'를 호출합니다. 왜냐하면'tab'은 여전히 ​​빈 문자열이고 listbox 항목이 선택된 후에 값을 가져 오기 때문입니다. 'listBox1_SelectedIndexChanged' 메소드로 생성하십시오. – Nino

+0

정말 고마워요. –

관련 문제