解決DropDownList常見問題三則

2021-09-22 06:32:20 字數 2961 閱讀 6265

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……

看看基類databoundcontrolperformselect方法

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之下的幾個控制項bulletedlistcheckboxlistdropdownlistlistboxradiobuttonlist,全部都存在同樣的問題,當然,解決方法也是一樣的。

兩年多沒寫部落格了,最近對技術,有點傷感!

我不相信神話,我只相信汗水!我不相信命運,我只相信雙手!

分類:

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...