近日在用
c#程式設計過程中遇到乙個非常罕見的異常,用了
3天時間終於給解決掉。問題雖然解決,但是迷惑仍然未解,還往高手能指點迷津。
我用乙個組合框來顯示資料表中的資料,其中賦值語句是這樣的(在載入主窗體過程中執行):
datatable tb = oracle.getdept(1);
//把取得的資料表賦給
tb,此語句無問題,
tb內容很正常,有
8條資料
if(tb.rows.count < 1)return;
//此語句無問題
cmb.datasource = tb;
//為組合框指定資料來源
cmb.displaymember = 「name」;
//為組合框指定顯示成員,字段型別為
varchar2
長度50
,名字為
name
cmb.valuemember = 「id」;
//為組合框指定值成員,字段型別為
integer
,名字為
id//
程式在此處出現異常,提示「
無效的列名」
然後,主窗體出現,組合框內資料顯示的居然是字段「
id」的內容,而組合框的
selectedvalue
的值卻是
system.data.datarowview.
難道是資料來源繫結中語句順序有誤?調換一下順序試試!於是小弟將資料來源繫結語句該為:
cmb.displaymember = 「name」;
//為組合框指定顯示成員,字段型別為
varchar2
長度50
,名字為
name
cmb.valuemember = 「id」;
//為組合框指定值成員,字段型別為
integer
,名字為
idcmb.datasource = tb;
//為組合框指定資料來源
儲存,編譯,重新執行,沒有異常丟擲!哈哈,難道真的是順序問題,只能把資料表放在最後?然而執行的結果卻是這樣的:組合框內資料居然全部顯示為「
system.data.datarowview
」,但是組合框的
selectedvalue
值卻是正常的,顯示的是資料表內「
id」欄位的內容。
這就奇怪了,為什麼呢?莫非文字框的屬性引起了此異常?
於是逐個檢查屬性,發現屬性非常正常。和另一視窗中的組合框屬性值相同,但是為什麼這裡不能夠正常顯示呢?難道資料表的問題?
然後小弟把資料表
tb指定給另一窗體中顯示正常的組合框,編譯執行。奇怪,顯示非常正常。看來不是資料來源的問題。那問題就究竟在**呢?難道是建構函式引起的。
檢查建構函式,單步跟蹤,沒有問題。組合框仍然無法正常顯示!
然後再單步跟蹤除錯,發現乙個問題:
程式在執行完了
cmb.datasource = tb;
後居然一下跳到組合框的
selectedindexchanged
事件中,執行完此事件後,才跳回到下一步:
cmb.displaymember = 「name」;
cmb.valuemember = 「id」;
怪了,為什麼呢?我沒有指定它的索引值也沒有觸發相關時間啊!
難道是資料表在裝載過程中,引起了索引值被非法改變的情況,所以才引發了
selectedindexchanged
事件,但是程式在執行到這一步時,組合框還不知道顯示成員和值成員是誰,所以才會找不到
selectedvalue
,而是用
system.data.datarowview
代替,所以才會丟擲異常,無效的列名?
那好,把下面語句:
cmb.displaymember = 「name」;
cmb.valuemember = 「id」;
加到
selectedindexchanged
事件的處理語句中。
編譯,儲存,老天,居然正常了!!!!!!!!!!!!!!!!
但是為什麼呢,為什麼給組合框指定資料來源會引發
selectedindexchanged
事件???????小弟仍然不能理解,還望有高手能指點一二,不然雖然問腿解決,但仍然不明就裡,糊里糊塗!
(2006-07-31 補充說明)
今天突然發現,原來執行良好的程式,突然出現問題,如前所述,仍然是資料來源綁訂到組合框的問題,發現指定的顯示成員和值成員的大小寫必須嚴格對照資料庫中的字段大小寫,不然也會出錯。
(2006-09-11 補記)
其實這根本就不算什麼罕見異常,只是我不了解c#控制項的屬性所致,在指定組合框的selectedindex屬性的時候,因為改變了屬性的值,所以必然會引發selectedindexchange事件。
Emgu CV的乙個異常的解決方法
今年組裡有大專案落我頭上了,並不能像去年一樣回家還能搞搞cocos2dx,一把老淚流了下來。回到正題,由於組裡需要做乙個顯示板的自動測試專案,涉及到computer vision。不得不說,這才是專案裡的大坑。之前一直在做其他基礎庫的研發,最近開始了視覺識別的研發進度。由於市面上沒有很合適的開源工業...
乙個CMake編譯問題的解決過程
如果將整個產品進行更新後,發現裝置和模擬器通訊不正常。實際的表象是這樣的,其實是忽略了乙個實際情況 老的應用使用之前的makefile直接make編譯而來,部分更新的時候,自己就是直接make生成進行的區域性替換,而全部替換是使用後來自己加入的cmake的方式進行的。這是問題的根源所在 開始的時候著...
乙個C 程式的執行過程
可能很多人都知道我們把程式打包成dll就丟出去了,但是裡面的具體的執行過程是怎麼樣的呢。程式集是由元資料和il組成的。il是和cpu無關的語言,是微軟的幾個專家請教了外面的編譯器的作則,開發出來的。il比大多數機器語言都要高階一點。il能夠訪問和操作物件型別,並提高了指令來初始化物件,呼叫物件上的虛...