ComboBox已經被綁定到了一個DataSet的Table中。該表中包含2列:一個string型的名稱列和一個int型的id列。名稱列被綁定到控制項的DisplayMember,而id列則被綁定到ValueMember。目的是通過對該控制項的操作得到SelectedValue中的int型id值。
現在的問題是:沒法得到該值,但奇怪的卻能從調試用的textBox中顯示出正確的值來。調試的片斷如下:
private void sourceName_SelectedValueChanged(object sender, System.EventArgs e)
{
string tstr=sourceName.SelectedValue.ToString();
textBox1.Text=tstr;
}
從斷點中觀察看到:
sourceName.SelectedValue.GetType()傳回值為System.Int32;
tstr值為"System.Data.DataRowView";
祛除斷點後卻看到textBox1中顯示出了正確的id值。
要怎樣才能得到這個id呢?
.NET Framework 版本是 1.1
asap綁定ComboBox這樣的Windows Form的時候,需要檢查三樣東西,即:DataSource, ValueMember, 和DisplayMember。SelectedValue的類型就是一個DataRowView類型,為了得到相應的值,必須將它強制轉換為相應的資料的欄位類型,才可以操作,例如:
((DataRowView)sourceName.SelectedValue).Row[sourceName.ValueMember].ToString()
你例子中的textbox也就是作了如上的隱含轉換。
慕羿綁定ComboBox這樣的Windows Form的時候,需要檢查三樣東西,即:DataSource, ValueMember, 和DisplayMember。SelectedValue的類型就是一個DataRowView類型,為了得到相應的值,必須將它強制轉換為相應的資料的欄位類型,才可以操作,例如:
((DataRowView)sourceName.SelectedValue).Row[sourceName.ValueMember].ToString()
你例子中的textbox也就是作了如上的隱含轉換。
還是不行,提示“指定的轉換無效”。試了一下,是指的(DataRowView)sourceName.SelectedValue轉換
此外,感覺SelectedValue的值應該不是DataRowView。否則textBox在進行隱式轉換的時候就不知道該選擇哪一個列了(我在調試的時候是先把值賦給了string變數然後再從變數中賦給textBox的)。
asap(System.Data.DataRowView) ???
慕羿(System.Data.DataRowView) ???
同樣。
用((DataRowView)sourceName.SelectedValue).Row[sourceName.ValueMember].ToString()的時候出錯資訊是列不在表中,把sourceName.ValueMember換成實際的列名字串就發生轉換無效。跟蹤了一下,在那時候sourceName.ValueMember居然會是空串。莫名其妙
找不出原因來,看來得要放棄這個方法了。
asap設定了DisplayMember,比如:mycombo.DisplayMember = "id"的話,可以這樣試試看:
sourceName.SelectedValue.Item("id")
edjia直接tostring沒有問題啊。
selectedvalue如果要轉為datarowview類型的話轉換無效。
慕羿設定了DisplayMember,比如:mycombo.DisplayMember = "id"的話,可以這樣試試看:
sourceName.SelectedValue.Item("id")
這樣會產生編譯錯誤:“object”並不包含對“Item”的定義
慕羿直接tostring沒有問題啊。
selectedvalue如果要轉為datarowview類型的話轉換無效。
直接ToString得到的就是:"System.Data.DataRowView"
edjiaSelectedItem是datarowview類型的吧。可以直接轉換。
我這裡使用selecteditem也沒有問題。
慕羿SelectedItem是datarowview類型的吧。可以直接轉換。
我這裡使用selecteditem也沒有問題。
我是想達到在列表中顯示名稱供選擇,然後直接通過SelectedValue取得相應的id值。看來沒把這個東西弄懂,做不了。現在改用SelectedIndex來查表取出這個值,實現了。
謝謝二位,非常感謝。
asap很高興你已經搞定了這個問題。 不過我還是想再會頭對SelectedValue說幾句。
1. 首先, string tstr=sourceName.SelectedValue.ToString(); 是完全可以的,但有個前提: 由於SelectedValue必須通過ValueMember來檢索,所以你必須在程式的初始化部分作資料繫結時,設定諸如:this.comboBox1.ValueMember = "ID";
2. 在程式初始化中,事件SelectedValueChanged會被觸發,而那時sourceName.SelectedValue尚沒有值,故執行1中的語句會出問題。 解決的手段有很多,最直接的就是做一個判斷,如:
if (sourceName.SelectedValue != null)
{
string tstr=sourceName.SelectedValue.ToString();
}
雖然不夠嚴謹,但供偵錯工具是足夠了。
在1,2兩個條件滿足後,程式可以順利執行。
當然,就你的目的而言, 這個方法有點笨, 用SelectIndex簡便多了。以上權作多一個思路吧。
Enjoy!
dodowolfLoL Asap上班真早
我剛才業在研究者事情來著
放一個MSDN的Example在這裡吧
_http://msdn.microsoft.com/library/en-us/dv_vstechart/html/vbtchnavigatingmultiplerelatedtablesinadonetdataset.asp
是關於多個DataSet之間的Navigation.
asapLoL Asap上班真早
我剛才業在研究者事情來著
放一個MSDN的Example在這裡吧
_http://msdn.microsoft.com/library/en-us/dv_vstechart/html/vbtchnavigatingmultiplerelatedtablesinadonetdataset.asp
是關於多個DataSet之間的Navigation.
1. 我不早, 你早。
2. 謝謝那個例子。
3. 對ComboBox這樣的Windows Form, 用SelectedIndexChanged比SelectedValueChanged來得普遍。
還是Borland的東東用得順手。m$的東西後勁足啊。.NET總讓人感覺有點怪,Andres這是“故意”向Java靠攏啊。
慕羿很高興你已經搞定了這個問題。 不過我還是想再會頭對SelectedValue說幾句。
1. 首先, string tstr=sourceName.SelectedValue.ToString(); 是完全可以的,但有個前提: 由於SelectedValue必須通過ValueMember來檢索,所以你必須在程式的初始化部分作資料繫結時,設定諸如:this.comboBox1.ValueMember = "ID";
2. 在程式初始化中,事件SelectedValueChanged會被觸發,而那時sourceName.SelectedValue尚沒有值,故執行1中的語句會出問題。 解決的手段有很多,最直接的就是做一個判斷,如:
if (sourceName.SelectedValue != null)
{
string tstr=sourceName.SelectedValue.ToString();
}
雖然不夠嚴謹,但供偵錯工具是足夠了。
在1,2兩個條件滿足後,程式可以順利執行。
當然,就你的目的而言, 這個方法有點笨, 用SelectIndex簡便多了。以上權作多一個思路吧。
Enjoy!
茅塞頓開啊,太感謝了!雖然感覺到SelectedValue中的值很不合道理,卻沒想到是控制項被初始化時發生的問題。結果這個問題困擾了我十幾個小時。
sourceName.SelectedValue != null不行,一開始那裡面不是null,而是一個DataRowView。見代碼:
private void sourceName_SelectedValueChanged(object sender, System.EventArgs e)
{
if (!(sourceName.SelectedValue.ToString() == "System.Data.DataRowView"))
{
int tid=(int)sourceName.SelectedValue;
textBox1.Text=tid.ToString();
}
}
為了隔離介面,我把DataSet的構建和管理放到了一個資料操作對象裡進行。於是要用SelectedIndex來實現的話就必須在對象裡多定義一個方法,而且多出了調用處理的過程,並不簡單也不自然。現在這樣實現要好多了。再次感謝