2017-06-01 30 views
0

因此,我實際上google了很多關於這個錯誤的信息,但是有一些解決方案的代碼我不明白,主要是因爲我是c#的新手,所以我會只是把問題保持原樣。System.Data.DataRowView錯誤

我的教授稱它爲「複雜的winform」。這基本上是來自2個不同表格的數據,這些表格與內部連接相關聯。到現在爲止還挺好。

我使用postgresql btw。

我有2個主表。學生(idstudent,registrationid,yearofstudy)和人員(包括idperson,姓名,電話,電子郵件等)。 (idstudent = idperson)

我的數據庫和7名學生中約有20人。學生也是人(duuh),ergo idstudent = idperson。

所以,我有一個組合框,在那裏我把所有的學生的研究的一年,並且它看起來像這樣。

private void frmComplex1_Load(object sender, EventArgs e) 
{ 

    OdbcConnection conexiune; 
    conexiune = new OdbcConnection(); 
    conexiune.ConnectionString = "Driver={PostgreSQL ANSI};database=postgres;server=localhost;port=5432;uid=postgres;sslmode=disable;readonly=0;protocol=7.4;fakeoidindex=0;showoidcolumn=0;rowversioning=0;showsystemtables=0;fetch=100;unknownsizes=0;maxvarcharsize=255;maxlongvarcharsize=8190;debug=0;commlog=0;usedeclarefetch=0;textaslongvarchar=1;unknownsaslongvarchar=0;boolsaschar=1;parse=0;extrasystableprefixes=dd_;lfconversion=1;updatablecursors=1;trueisminus1=0;bi=0;byteaaslongvarbinary=0;useserversideprepare=1;lowercaseidentifier=0;gssauthusegss=0;xaopt=1;pwd=irimia96"; 
    conexiune.Open(); 

    OdbcCommand comanda; 
    comanda = new OdbcCommand(); 
    comanda.CommandText = "SELECT DISTINCT anstudiu from studenti ORDER BY anstudiu asc "; 
    comanda.Connection = conexiune; 

    OdbcDataReader cititor; 
    cititor = comanda.ExecuteReader(); 

    DataSet dsDate; 
    dsDate = new DataSet(); 
    DataTable tblStudenti; 
    tblStudenti = new DataTable("studenti"); 
    tblStudenti.Load(cititor); 
    dsDate.Tables.Add(tblStudenti); 

    this.cboComplex1.DataSource = dsDate.Tables["studenti"]; 
    this.cboComplex1.DisplayMember = "anstudiu"; 
    this.cboComplex1.ValueMember = "anstudiu"; 








    conexiune.Close(); 
} 

那麼什麼即時試圖做的是,每當我從下拉框中選擇一年(1/2/3),以得到的回報,我的第一個DataGrindView詳情關於那些年級學生1/2/3名來自學生桌和PERSON TABLE。例如:學生從二年級開始學習。 IdPerson,姓名,電話,電子郵件,RegistrationId,學生證。 (我知道學生證和人員標識會得到相同的價值,但我不在乎,首先讓它工作)

所以我輸入腳本,並獲得這個datarawview錯誤

private void cboComplex1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    OdbcConnection conexiune; 
    OdbcCommand comanda; 
    DataSet dsDate; 
    OdbcDataReader cititor; 
    DataTable tblPersoane; 


    conexiune = new OdbcConnection(); 
    conexiune.ConnectionString = " Driver={PostgreSQL ANSI};database=postgres;server=localhost;port=5432;uid=postgres;sslmode=disable;readonly=0;protocol=7.4;fakeoidindex=0;showoidcolumn=0;rowversioning=0;showsystemtables=0;fetch=100;unknownsizes=0;maxvarcharsize=255;maxlongvarcharsize=8190;debug=0;commlog=0;usedeclarefetch=0;textaslongvarchar=1;unknownsaslongvarchar=0;boolsaschar=1;parse=0;extrasystableprefixes=dd_;lfconversion=1;updatablecursors=1;trueisminus1=0;bi=0;byteaaslongvarbinary=0;useserversideprepare=1;lowercaseidentifier=0;gssauthusegss=0;xaopt=1;pwd=irimia96"; 
    conexiune.Open(); 

    comanda = new OdbcCommand(); 
    comanda.CommandText = "SELECT * from persoane INNER JOIN studenti on persoane.idpersoana = studenti.idstudent WHERE anstudiu =?"; 
    comanda.Connection = conexiune; 


    comanda.Parameters.Clear(); 
    comanda.Parameters.AddWithValue("anstudiu", cboComplex1.SelectedValue.ToString()); 

    cititor = comanda.ExecuteReader(); 
    tblPersoane = new DataTable("persoane"); 
    tblPersoane.Load(cititor); 
    dsDate = new DataSet(); 
    dsDate.Tables.Add(tblPersoane); 

    dGComplex.DataSource = dsDate; 
    dGComplex.DataMember = "persoane"; 
    dGComplex.Refresh(); 


} 

Srry爲很長的職位,我會在最後給你一個馬鈴薯。

+1

不,它不是更好的照片。這是很難閱讀,它是不可能複製/粘貼到測試。發佈您的代碼。順便一提。什麼是錯誤? – Steve

+0

我現在看到它。問題出在用於填充組合框的代碼中。您已使用DataTable設置DataSource,但忘記設置DisplayMember和ValueMember屬性。 – Steve

+0

你可以設置一個斷點,看看'cboComplex1.SelectedValue.ToString()'返回什麼?最有可能的是它返回一個'System.Data.DataRowView'類型的對象,而不是你想要的值。另外,請注意,如果列類型是一個Integer,那麼在傳入字符串之前,必須將該字符串解析爲一個int。 – PoweredByOrange

回答

0

就反轉爲DisplayMember/ValueMember設置的順序相對於DataSource屬性的

this.cboComplex1.DisplayMember = "anstudiu"; 
this.cboComplex1.ValueMember = "anstudiu"; 
// Move this line after setting the Disply/ValueMember property 
this.cboComplex1.DataSource = dsDate.Tables["studenti"]; 

這應確保用於顯示/ ValueMember反對的字段名字符串的正確綁定設置數據表。
我應該補充一點,如果您輸入某個字段名稱(例如「anstdiu」將被接受),則此模式不會捕獲錯誤。
相反,如果您在顯示/值成員之前設置了數據源,嘗試寫入無效的名稱將會導致運行時異常。

相關問題