Unutacağımdan adım gibi emin olduğum ya da unutmaya meyilli olduğuma ikna olduğum şeyleri kendim için not alıyorum. İşinize yarar bişey çıkarsa helali hoş olsun, kaynak gösterirseniz ya da herhangi bir geri besleme yaparsanız kendimi yalnız hissetmemiş olurum ;) Saygılar.
Friday, April 20, 2012
Visual Studio Solution'da WCF projesine Referans verdim almadı
Visual Studio Solution'umuzda birkaç tane katman projelerimiz ve bir de WCF Service projemiz var. Milleti birbirine refere ede ede güzel bir proje mimarisi oluşturduk ve son katrede service projesine referansları verdiiiik. Yazarken filan sorun yok, şıkır şıkır eklendi herşey.. eveet.. Autocompleting.. Süper.. Derleyeliiim:
Ama o da ne? Kara bir büyü gibi bir anda errorlar türemeye başladı: Filanca yok, falanca yok aceba eksik bir referansınız mı var? Eğer şanslıysanız ve "Error List" penceresinde Warning'leriniz de açıksa aşağıdaki uyarıyı görürsünüz, ama değilse "yaa ben bu referansları ekledim ya niye almıyor ki" diye uğraşır durursunuz.
Uyarı şöyle:
The referenced assembly "bişeybişey, Version=bilmemkaç, Culture=neutral, processorArchitecture=MSIL" could not be resolved because it has a dependency on "falanfilan, Version=birkaç, Culture=neutral, PublicKeyToken=kalabalikbiralfanümerik" which is not in the currently targeted framework ".NETFramework,Version=vX.X,Profile=Client". Please remove references to assemblies not in the targeted framework or consider retargeting your project.
Bu uyarıdaki kilit ifade vurguladığım yer. Client Frameworkde WCF ve WPF desteği yok.
Çözüm:
WCF Projesini
1- Sağ tık -> "Properties"
2- (Kuvvetle muhtemel ilk gelen sekme olan) "Application" sekmesi
3- Ya "Target Framework" = ".Net Framework X.X" (DİKKAT ".Net Framework X.X Client" olan DEĞİL)
3- Ya da: "Target Framework" altında "Client Profile..vs." diye bir checkbox kaldırma
4- Mutlu bir hayat
Friday, March 16, 2012
TFS'de çekip giden umarsız takım arkadaşı ya da "Başka Kullanıcı Değişiklik İptali"
Team Foundation Server, işin uzmanlarına göre VSS'den çok daha iyi bir Kaynak Kod Yöneticisi. (Yani sadece bu noktadan değerlendirince, çünkü TFS direkt olarak VSS ile kıyaslanamayacak kadar genişletilmiş bir araç.) Ancak kolay olan daha evlâ dedirtecek bazı durumlar da her zaman olmuyor değil:
Diyelim ki ekip olarak TFS kullanıyorsunuz. Ekipten biri ayrıldı ve siz aynı dosyalarda çalışmalar yapıp dosyanın daha düzgün sürümünü elde ettiniz. Ancak Source Control Explorer hep o dosyaların diğer kişide bekelemede olduğunu söyleyip duruyor. Hatta check-in lerinizden sonra da dosyanın kenarında güzel bir kilit ikonu yerine gıcık bi adam ikonu çıkıyor. Nasıl olacak da o değişiklikleri iptal ederiz?
Önce bu terimi türkçe olarak internette aramaya çalışırız; mesela "TFS Başka Kullanıcı Değişiklik İptal", tahmin edebileceğiniz gibi HİÇ kaynak bulunmaz. (Ta ki bu yazı yazılana kadar) Başka birkaç denemeden sonra, çat-pat ingilizcelerimizle ingilizce arama yaparsak, mesela: "TFS how to undo other users check-out" diye bir şansımızı deneyelim. Oley. Birsürü kaynak çıktı. Eminim biri işe yarar diye yeni onlarca sekme açmaya başlıyoruz. MSDN kaynaklı tüm yönlendirmelerde, garip bir Visual Studio Command Promt(VSCP) kullandırım hırsı olduğunu görünce, kendi kendimize "üf aman iyi bari olsun da komutla olsun" diye söylene söylene ve aynı zamanda üşene üşene 8 ya da 10 yere tıklayarak VSCP yi açıyoruz. (Bu konuda microsoft u çok tutarlı bulmuyorum. Bir yandan herşeyi arayüz programlarıyla basitleştirmekte olmayı felsefe edinen firma, diğer yandan nerdeyse her türlü düzenleme için VSCP açtırıyor nedense.) Sonra cins bir komut yazmaya başlıyoruz; öyle bir komut var ki, parametre olarak bir tek TCKimlik numarasıyla nüfus cüzdanı seri numarası girmediğimiz kalıyor. Uzun uzun yazdıktan sonra, işe yaramadığını (en azından benim durumumda) görüyoruz.
Aramalara devam edince aslında çok daha basit bir yol olduğunu fark ediyoruz. Ancak bu arada 7 saate yakın bir zaman geçmiş oluyor. İşte sizin de bi 7 saatiniz gitmesin (ya da bir dahaki sefere en azından kendimin 7 saati daha gitmesin) diye yazıyorum:
Evvela TFS Sunucusu üzerinde "Undo other users' changes" ve "Unlock other users' changes" haklarınız olmalı. Bu haklar nasıl yönetiliyor bu konuya girmek istemiyorum çünkü şu an 5.paragrafı yazdığımı ve hala konuya giremediğimi fark ettim.
TFS Power Tools (TFS 2010) ya da TFS Power Tools (TFS 2012) kurulur.
Diyelim ki ekip olarak TFS kullanıyorsunuz. Ekipten biri ayrıldı ve siz aynı dosyalarda çalışmalar yapıp dosyanın daha düzgün sürümünü elde ettiniz. Ancak Source Control Explorer hep o dosyaların diğer kişide bekelemede olduğunu söyleyip duruyor. Hatta check-in lerinizden sonra da dosyanın kenarında güzel bir kilit ikonu yerine gıcık bi adam ikonu çıkıyor. Nasıl olacak da o değişiklikleri iptal ederiz?
Önce bu terimi türkçe olarak internette aramaya çalışırız; mesela "TFS Başka Kullanıcı Değişiklik İptal", tahmin edebileceğiniz gibi HİÇ kaynak bulunmaz. (Ta ki bu yazı yazılana kadar) Başka birkaç denemeden sonra, çat-pat ingilizcelerimizle ingilizce arama yaparsak, mesela: "TFS how to undo other users check-out" diye bir şansımızı deneyelim. Oley. Birsürü kaynak çıktı. Eminim biri işe yarar diye yeni onlarca sekme açmaya başlıyoruz. MSDN kaynaklı tüm yönlendirmelerde, garip bir Visual Studio Command Promt(VSCP) kullandırım hırsı olduğunu görünce, kendi kendimize "üf aman iyi bari olsun da komutla olsun" diye söylene söylene ve aynı zamanda üşene üşene 8 ya da 10 yere tıklayarak VSCP yi açıyoruz. (Bu konuda microsoft u çok tutarlı bulmuyorum. Bir yandan herşeyi arayüz programlarıyla basitleştirmekte olmayı felsefe edinen firma, diğer yandan nerdeyse her türlü düzenleme için VSCP açtırıyor nedense.) Sonra cins bir komut yazmaya başlıyoruz; öyle bir komut var ki, parametre olarak bir tek TCKimlik numarasıyla nüfus cüzdanı seri numarası girmediğimiz kalıyor. Uzun uzun yazdıktan sonra, işe yaramadığını (en azından benim durumumda) görüyoruz.
Aramalara devam edince aslında çok daha basit bir yol olduğunu fark ediyoruz. Ancak bu arada 7 saate yakın bir zaman geçmiş oluyor. İşte sizin de bi 7 saatiniz gitmesin (ya da bir dahaki sefere en azından kendimin 7 saati daha gitmesin) diye yazıyorum:
Evvela TFS Sunucusu üzerinde "Undo other users' changes" ve "Unlock other users' changes" haklarınız olmalı. Bu haklar nasıl yönetiliyor bu konuya girmek istemiyorum çünkü şu an 5.paragrafı yazdığımı ve hala konuya giremediğimi fark ettim.
TFS Power Tools (TFS 2010) ya da TFS Power Tools (TFS 2012) kurulur.
Daha sonra:
- Source Control Explorer Açılır (Visual Studio içinde)
- Tek dosyadaki değişiklik için dosya üzerinde, birden çok dosyada değişiklik için dosyaların bulunduğu dizin üzerinde sağ tıklanır
- Find in Source Control ve ordan Status seçilir
- Find in Source Control diyaloğunda, Status checkbox işaretli kalsın
- Aramayı daratlmak için Wildcart veya username alanında "Display files checked out to:" textbox'ına birşeyler yazılabilir
- Find tuşuna basılır ve böylece bir liste gelecektir
- Gelen listede undo edilecek öğeler seçilir
- Sağ tıklanıp Undo denir.
- "Undo all selected changes?" sorusuna da ne dememiz gerektiğini söylemek etik olmaz sanırım.
Bir de Team Foundation Sidekicks diye 3.parti bir tool dan söz ediyorlar ama ben denediğimde sürekli hata verip kapandı. Zaten böyle 3.parti şeyleri pek fazla sevmiyorum. (Tabi kişisel tercihimdir.)
Kolay gelsin.
Kolay gelsin.
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.
Tuesday, December 27, 2011
String.Format içinde Süslü Parantez ('{' veya '}') kullanımı
Eğer String.Format içinde süslü parantezli bir şeyler de göstermek istersek, yapmamız gereken tek şey parantezi 1 değil 2 tane yazmak. Bu durumda süslü parantezin Escape karakteri kendisi oluyor:
string susluParantezli = string.Format("Süslü parantez işaretleri: Açma işareti: {{, Kapama İşareti: }}");
//Çıktısı: Süslü parantez işaretleri: Açma işareti: {, Kapama İşareti: }
string susluParantezli = string.Format("Süslü parantez işaretleri: Açma işareti: {{, Kapama İşareti: }}");
//Çıktısı: Süslü parantez işaretleri: Açma işareti: {, Kapama İşareti: }
DevExpress Kontrollerinde "ClientIDMode" Özelliği
DevExspress Kontrolleri ile çalışırken, eğer kontrollerin ClientID'lerinin farklı farklı olmasını istiyorsak, ClientInstanceName özelliğini set etmemek yetmez, ClientIDMode özelliğini "AutoId" demek de gerekiyor.
Friday, December 23, 2011
Javascript Eval() ya da başka bir deyişle; string'e değer olarak atanmış kodu çalıştırma
Çok basit bir konu olmasına rağman unutuyoruz ve "Kardeşim Evaluate işte.. Aratırım bu ifadeyi, çıkar cevabı karşıma.." diye düşünebiliyoruz ancak fonksiyon adını unutunca ve iş başa düşünce "ya bi değişkene atanan bir değerde kod var.. onu nasıl çalıştırabilirim ki" diye enteresan aramalar yapmaya çalışıyoruz. Bunun için yazma ihtiyacı hissettim;
JQuery harika. Tek kelimeyle dahiyane bir fikir. İlk yazanlara da geliştirenlere de helal olsun. Sırf JQuery var diye web sitelerimizin UI kısımları adama benzer oldu. Bir sürü gönüllü, yüce, cömert açık kaynak insanları da JQuery üzerine her geçen gün yeni yeni plug-in ler ekliyor. Hepsinin ayrı ayrı ellerine emeklerine sağlık.
Ancak bu güzel gelişmeye rağmen elbette ki, (ve hatta JQuery programlarken bile, doğal olarak) JavaScript kullanmaya devam ediyoruz ve edeceğiz de.
Dinamik programlama yapan herkesin de derdi bir şekilde hep aynı kapı: kod bloklarının havada üretilmesi ve çalıştırması (produce and execute code blocks at runtime).
İşte bir dinamik kod insanının JQuery programlarken ya da editlerken bile ihtiyacı olabilecek şifa gibi bir fonksiyondur kendisi
Eval(var codeBlockScript)
İşlevi çok basit: JavaScript kodunu string bir değişkene yaz, sonra ver Eval()'e senin için çalıştırıversin:
İşte bu kadar.
JQuery harika. Tek kelimeyle dahiyane bir fikir. İlk yazanlara da geliştirenlere de helal olsun. Sırf JQuery var diye web sitelerimizin UI kısımları adama benzer oldu. Bir sürü gönüllü, yüce, cömert açık kaynak insanları da JQuery üzerine her geçen gün yeni yeni plug-in ler ekliyor. Hepsinin ayrı ayrı ellerine emeklerine sağlık.
Ancak bu güzel gelişmeye rağmen elbette ki, (ve hatta JQuery programlarken bile, doğal olarak) JavaScript kullanmaya devam ediyoruz ve edeceğiz de.
Dinamik programlama yapan herkesin de derdi bir şekilde hep aynı kapı: kod bloklarının havada üretilmesi ve çalıştırması (produce and execute code blocks at runtime).
İşte bir dinamik kod insanının JQuery programlarken ya da editlerken bile ihtiyacı olabilecek şifa gibi bir fonksiyondur kendisi
Eval(var codeBlockScript)
İşlevi çok basit: JavaScript kodunu string bir değişkene yaz, sonra ver Eval()'e senin için çalıştırıversin:
var codeBlockScript;
codeBlockScript = "alert(";
codeBlockScript += "\"Bu bir dinamik mesajdır.\"";
codeBlockScript += ");";
Eval(codeBlockScript);
İşte bu kadar.
Wednesday, December 14, 2011
ASP.Net'te bir kontrolü bir stringe render etme
1.) Buna neden ihtiyaç duyulsun ki?
El-Cevap: Diyelim ki sayfanın(.aspx) bir yerine bir Literal koyduk ve belirli bir duruma göre bu literalin içine farklı içerik getiren kod yazıyoruz. Bir string tanımlarız ve içine istediğimiz html içeriği elle yazar yollarız. Hatta çoksatırlı(multiline) olsun, (biraz da artistlik olsun) diye de stringi:
şeklinde tanımlarız.
Çok güzel,
Pekâla ama eğer bir asp.net kontrolünü de içeriğe eklemek istersek nasıl yaparız? Direk araya bir yerlere basarız "<asp:Button .. vd." kodumuzu, değil mi? Ama bu string'in render edilmiş hali ne olur sizce? Tabii ki stringin içindeki button render edilmeden gönderildiği için, literalinizin içinde anlamsız bir "<asp:Button .. vd." html tagı bulunacaktır. İşte buna benzer bir durumu kotarmak için ihtiyaç duyarız.
2.) Peki nasıl yapılıyor?
El-Cevap: Aslında çok basit. Sayfayı derlerken yapılacak olan Asp.Net Control Rendering'ini elle yaptırıyoruz.
Eğer tek bir kontrolü render ettireceksek:
Kompleks bir kontrolü(yani içinde kontroller olan bir kontrolü render ettireceksek:
El-Cevap: Diyelim ki sayfanın(.aspx) bir yerine bir Literal koyduk ve belirli bir duruma göre bu literalin içine farklı içerik getiren kod yazıyoruz. Bir string tanımlarız ve içine istediğimiz html içeriği elle yazar yollarız. Hatta çoksatırlı(multiline) olsun, (biraz da artistlik olsun) diye de stringi:
string HtmlIcerik = @"
<div>
<p>Merhaba Dünya!</p>
<font color=""red"">Bu içeriği ben sunucuda oluşturdum.</font>
</div>";
şeklinde tanımlarız.
Çok güzel,
Pekâla ama eğer bir asp.net kontrolünü de içeriğe eklemek istersek nasıl yaparız? Direk araya bir yerlere basarız "<asp:Button .. vd." kodumuzu, değil mi? Ama bu string'in render edilmiş hali ne olur sizce? Tabii ki stringin içindeki button render edilmeden gönderildiği için, literalinizin içinde anlamsız bir "<asp:Button .. vd." html tagı bulunacaktır. İşte buna benzer bir durumu kotarmak için ihtiyaç duyarız.
2.) Peki nasıl yapılıyor?
El-Cevap: Aslında çok basit. Sayfayı derlerken yapılacak olan Asp.Net Control Rendering'ini elle yaptırıyoruz.
Eğer tek bir kontrolü render ettireceksek:
//BenimKontolum Control'den türemiş herhangi birşey
var newContent = string.Empty;
using (var stringWriter = new StringWriter())
using (var htmlWriter = new HtmlTextWriter(stringWriter))
{
BenimKontrolum.RenderControl(htmlWriter);
newContent = stringWriter.ToString();
}
return newContent;
Kompleks bir kontrolü(yani içinde kontroller olan bir kontrolü render ettireceksek:
var newContent = string.Empty;
using (var stringWriter = new StringWriter())
using (var htmlWriter = new HtmlTextWriter(stringWriter))
{
foreach (var control in controls)
{
control.RenderControl(htmlWriter);
}
newContent = stringWriter.ToString();
}
Subscribe to:
Posts (Atom)