Wednesday, December 28, 2011

ASPxComboBox SelectedItem null Oluyor ise, bunun da bir sebebi var !


Saatlerce süren ve gerilim artıran uğraşılar sonunda (belki kuytu köşe bir yerlerde dokümante edilen, belki edilmeyen bile, ve dahi aratınca google'da dahi çıkmayan) gafil bir konuda yeni bir post yazma ihtiyacı ivedilikle hasıl oldu:

Bir DevExspress gridine Edit Template yazıp, birden fazla DevExpress ComboBox kullanıyorum. Grid Event'lerinde bunlardan biri hariç diğerlerinin tamamının SelectedItem ve SelectedIndex özelliklerine güzel güzel erişiyorum. Ancak dediğim gibi: biri hariç!

Yazının başında söylediğim gibi, saatlerce süren uğraştan sonra sebebinin şuna dayandığını gördüm: ComboBox'ın ValueType özelliğini set etmeyince, (sanırım ViewState'e yazılmıyor ve dolayısıyla) seçilen değer post ya da call back esnasında uçup gidiyor. Böylece de yukarda yazdığım özellikler null oluyor.

Örnek kod:


     <dx:ASPxComboBox ID="DxMyCombo" runat="server" ClientIDMode="AutoID"  
TextFormatString="{0}" ValueField="ValueId"
ValueType="System.Int32" >
<Columns>
<dx:ListBoxColumn FieldName="ValueId" Visible="false" />
<dx:ListBoxColumn FieldName="Value01" />
<dx:ListBoxColumn FieldName="Value02" />
</Columns>
</dx:ASPxComboBox>


Eğer ValueType verildiği halde Postback(ya da Callback) durumlarında yine de değerini sürekli null okuduğumuz bir ASPxComboBox(bundan sonra combo diye anılacaktır) için;

 - Eğer kullanmakta olduğumuz combo, bir kontrolün içindeyse, sorun Sayfa Yaşam Döngüsü (Page LifeCycle). Okumaya çalıştığımız değere Load eventinde henüz hazırlanmamış oluyor. Bunu sebebi de Control Load'larının Page Loaddan sonra olması. Aslında denen odur ki, ViewState okuma işi Init eventinde olur. Eğer bu doğruysa, Control Initleri Page Loadında (hatta Page Initten bile önce) çoktan geçilmiş ve ViewState'in okunup değerlerin yüklenmiş olması beklenir. Ama her nedense böyle olmuyor ve çalışmakta olduğunuz asıl Page'inizin Load eventinde combo'nun değeri henüz yüklenmemiş oluyor.

Yani demem odur ki, eğer yukarıda bahsettiğim gibi ValueType'dan kaynaklanmayan bir neden den ötürü sayfaya yaptığınız Post ya da Callback'de combo değeri null ise, değer okumaya çalıştığınız eventi biraz daha erteleyin. (Ben kendi olayımda Load'da okuyamadığım için LoadComplete eventine kaydoldum ve burdan eriştim.)

Bir de eğer atama yapacaksanız,
   DxMyCombo.SelectedItem = DxMyCombo.Items.FindByValue(#DegerTipi)
kodunu önce mutlaka deneyin. #DegerTipi, yukarıda vurguladığım ValueType'a ne verdiyseniz o. (Yukarıdaki durum için int bir sayı.)

(Bu berbat tarzancadan dolayı da affınıza sığınırım)


Not: DevExpress konusunda yazdığım blog gönderilerindeki davranış özelliklerinin pek çoğu, belki ASP.Net WebControl base'inden geliyordur ve standart kontrollerde de vardır. Bu konuyu henüz bilmiyorum ancak DevExpress için yazdığım şekilde oluyor. İlerde boş bir zamanda oturup deneyip gönderiler üzerinde gerekli notları eklerim.

3 comments:

  1. Teşekkürler. Böyle böyle yaparken sağlam bir makale yazacak seviyeye ulaşacağınıza eminim.

    ReplyDelete
  2. Hocam merhaba bişey sorucaktım coolums doldurduk ok güncelleme yapıcam Urun tablomdan UrunID si ValueId ye eşit olan kaydı selected yapıcam ama column u ? item değil nasıl yapabiliriz.

    var gln = tblurun.where(p=> p.urunid == urunid).firstordefault();
    ddlcombobox.selecteditem = gln.UrunID gibi bir işlem yapıcam ?

    ReplyDelete
    Replies
    1. Uzun zaman geçti ve muhtemelen ihtiyacınız kalmamıştır ama yukarıda atama için "FindByValue" diye bir metoddan bahsetmiştim onu denemenizi tavsiye edebilirim.

      Delete