C#中如何取得ComboBox控制項SelectedValue的正確值?[C#鬱悶]

來源:互聯網
上載者:User
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來實現的話就必須在對象裡多定義一個方法,而且多出了調用處理的過程,並不簡單也不自然。現在這樣實現要好多了。再次感謝

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.