okeyj.. to juz dziwne.. [zakladajac ze pozostale okolice masz poprawne..]
nie chce mi sie kopac na MSDN, wiec.. reflector mowi:
public object DataSource
{
set
{
if (((value != null) && !(value is IList)) && !(value is IListSource))
throw new ArgumentException(SR.GetString("BadDataSourceForComplexBinding"));
if (this.dataSource != value)
{
try { this.SetDataConnection(value, this.displayMember, false); } /// <----- wyjatek tu
catch { this.DisplayMember = ""; } // <--- powoduje to
if (value == null) { this.DisplayMember = ""; } // <--- chyba ze podasz null jako datasource, to tez czysci DispMembr
} } }
public string DisplayMember
{
set
{
BindingMemberInfo displayMember = this.displayMember;
try { this.SetDataConnection(this.dataSource, new BindingMemberInfo(value), false); } //<-- wyjatek tutaj
catch { this.displayMember = displayMember; } //<-- powoduje olanie podanej wartosci i przywrocenie poprzedniej
} }
public string ValueMember
{
set
{
if (value == null) value = "";
BindingMemberInfo newDisplayMember = new BindingMemberInfo(value);
if (!newDisplayMember.Equals(this.valueMember)) // <- jesli byla zmiana wartosci valuemember na inna..
{
if (this.DisplayMember.Length == 0)
this.SetDataConnection(this.DataSource, newDisplayMember, false); // <- brak trycatch! wyjatek tutaj wywali program
if (((this.dataManager != null) && (value != null)) && ((value.Length != 0) && !this.BindingMemberInfoInDataManager(newDisplayMember)))
throw new ArgumentException(SR.GetString("ListControlWrongValueMember"), "value");
this.valueMember = newDisplayMember;
this.OnValueMemberChanged(EventArgs.Empty);
this.OnSelectedValueChanged(EventArgs.Empty);
} } }
stad wnioski:
-
jesli w valuemember by cos rzucilo wyjatkiem, to bys to na pewno zobaczyl. w takim razie valuemember pewnie ustawia sie i zapamietauje prawidlowo - tak sie nie dzieje, program sie nie wywala z wyjatkiem na tej linii, prawda?
-
datasource i displaymember uzywaja SetDataConnection, jesli ona walnie wyjatkiem - nie przyjmuja wartosci i 'resetuja' sie do null albo do poprzedniej. Ty tego wyjatku nigdy nie zobaczysz, bo jest obudowane trycatchem.
stad wniosek: musial poleciec w srodku comboboxa wyjatek, jeszcze w DataSource:set i zczyscic Ci DisplayMember, potem pozniejsze proby ustawienia DisplayMember owocowaly za pewne tym samym wyjatkiem w SetDataConnection i przywracala sie stara wartosc (pusta od czasu DataSource:set !)
sprobuj zrobic tak: na starcie formatki NIE ustawiaj ValueMember, niech bedzie puste, ustaw je prawidlowo dopiero PO ustawieniu datasource. jesli poleci wyjatek i wywali aplikacje - czegos sie dowiedzelismy: musial poleciec z SetDataConnection. opisz to, wklej tresc wyjatku.
drugie podejscie: zrob tak samo jak przed chwila, ale po datasource:set ustaw ValueMember na "Name", odpal, sprwadz czy wyjatek wywali aplikacje, opisz, wklej wyjatek.
trzecie: teraz bedzie ciezej, bo wyjatek bedzie wygaszony.. ale mozna go 'wykryc'..
odpal program jeszcze raz w trybie debug, zhaltuj go na linijce DATASOURCE = xxx, przejdz do debuggera, obejrzyj zawartosc okienka Output, wyczysc je, przestepuj sie przez ta linie, sprawdz w Output czy pojawila sie informacja o wyjatku (First chance exception blah blah). jesli tak - wklej tutaj te inforamcje.
troche wyjasnien co do SetDataConnection, wyjatek w nim leci np. gdy:
- nie uda sie wyciagnac z obiektu datasource'a informacji o liscie wlasciwosci jego elementow
- property elementu wskazane przez DisplayMember jest typu IList
- element w ogole nie ma w property o takiej nazwie (sprawdzane case-insensitive zeby bylo smieszniej..)
i wyjatek wtedy zwie sie.. ArgumentException. jak go zauwazysz podczas w/w trzech prob, to mow o tym wyraznie i sprawdz 30 razy czy dobre rzeczy wpisales w Display/Value member i czy kolekcja w DataSource na pewno na bank na 100% nie jest przypadkiem pusta..
wiecej Ci raczej juz w ciemno nie powiem.. musialbys wyslac cala formatke, lacznie z przykladowymi danymi jakie Ci linq sciaga z bazy