1,給selectedvalue賦值時,如果items中沒有該項,則報***異常;
2,在繫結時,如果資料來源返回null,它將不做任何動作,而我們一般習慣清空;
3,在繫結到資料來源,而資料來源引數依賴於別的控制項時,會觸發兩次資料來源繫結。
我的解決方法就是過載dropdownlist(比較菜),下面詳細說說這三個小問題:
1,比如某個商品屬於某個分類,然後分類被刪除了,而商品表中記錄的還是原來類別的id,在繫結dropdownlist時,就會報那個常見的異常。這個比較頭疼,因為沒有太好的辦法使用**控制。我們可以通過過載selectedvalue屬性和performdatabinding方法來解決:
private
const string exceptionstring =
"(異常)
";
private string cachedselectedvalue;
//////
已過載。加上未新增到列表的項。
///
public
override
string selectedvalue
set
base.selectedvalue = value;
}
}
//////
繫結資料
///
///
protected
override
void performdatabinding(ienumerable datasource)
item.selected =
true;
}
}
2,在省市兩級下拉聯動的時候,如果第一級選擇直轄市,沒有下一級城市,第二個下拉就應該顯示沒有子城市或者就顯示直轄市,或者乾脆清空。而預設情況下,dropdownlist是不做任何事情的。這個可以過載performselect實現(含第三點的實現**):
private boolean selecting =
false;
//////
已過載。避免繫結時重入該方法
///
protected
override
void performselect()
base.performselect();
selecting =
false;
}
3, 仍然是省市兩級下拉聯動的例子,這兩個dropdownlist分別繫結兩個objectdatasource,對應實體類的area.findallbyparentid(int32 parentid)。第乙個下來可以設定引數為固定值0,表示頂級地區"0
" name=
"parentid
" type=
"int32
" />
;第二個下拉可以使用controlparameter,依賴於第乙個下拉的選擇
"dropdownlist1
" name=
"parentid
" propertyname=
"selectedvalue
" type=
"int32
" />
這個時候,如果在findallbyparentid下斷點,會發現第二個下拉觸發了兩次繫結
經過一番探索發現:首先是第二個dropdownlist的databind,觸發了objectdatasource的select,而在準備select的引數的時候,需要呼叫引數的updatevalue去取依賴控制項的值,正是這個updatevalue,觸發了datasourcechanged(實際比較複雜,這裡為了易懂,從簡),然後再次select……
看看基類databoundcontrol的performselect方法
protected
override
void performselect()
datasourceview data =
this.getdata();
this._arguments =
this.createdatasourceselectarguments();
this._ignoredatasourceviewchanged =
true;
base.requiresdatabinding =
false;
this.markasdatabound();
data.select(
this._arguments,
new datasourceviewselectcallback(
this.ondatasourceviewselectcallback));
}
很明顯,_ignoredatasourceviewchanged欄位就是專門解決這個問題的。也就是說,控制項團隊已經意識到會存在這種問題,所以在這裡留了一手。但是為什麼這一手沒有生效呢?
我們來看看dropdownlist的父類listcontrol,杯具,它過載了performselect:
protected
override
void performselect()
並且沒有呼叫父類的方法……這也說明了,listcontrol之下的幾個控制項bulletedlist、checkboxlist、dropdownlist、listbox、radiobuttonlist,全部都存在同樣的問題,當然,解決方法也是一樣的。
兩年多沒寫部落格了,最近對技術,有點傷感!
我不相信神話,我只相信汗水!我不相信命運,我只相信雙手!
分類:
c#
擴充套件DropDownList
使用dropdownlist,我們習慣在所有待選資料前面加乙個空白項,或者 請選擇 的提示,微軟卻沒有,這可能就是中西文化的差異.現在擴充套件為dropdownlistpro 經過 除錯,和看源 得知預設選中的行為是在selectedindex的get方法中設定的.所以過載該方法,即可達到目的.pu...
dropdownlist資料繫結
在web.config配置檔案連線資料庫 新建乙個 sqlhelp 類 string scon system.configuration.configurationmanager.connectionstrings scon connectionstring 執行查詢的方法返回的是乙個dataset...
DropDownList使用總結
code 1 5g 若selectedvalue沒有對應的5g,則丟擲如下異常 dropdownlist1 有乙個無效 selectedvalue,因為它不在專案列表中。引數名 value 2 president 是設定索引中最小項的值為president,並不是選擇文字為president的項 3...