Javascript ile aspx nesnesine ulaşmak ve hexadecimal renk
“Uzun yazacağım, öyle kısa kısa yazıp yayınlamayacağım” diye kural koymuştum kendime fakat böyle yaptığım için en fazla iki üç cümlede anlatılacak şeyleri yazamadığımı farkettim (Ne keşif ama
) ve “okuyana yararı olacaksa tek kelimelik bir girdi bile yaparım” şeklinde bir karar aldım.
Yazıyı yazdıktan sonra eklenen not : Bu uzun oldu ama artık kısa da olabilir yazılarım
Geçen gün C# kodlarken karşılaştığım bir kaç sorun ve çözümünden bahsedeceğim.
1) Kullanıcıya renk seçimi yaptırmam gerekiyordu. Bunun için enteresan bir renk paleti buldum. Arkadaşın birisi 256′lık renk paletinin resmini almış, maplemiş ve her map adresine de üzerine geldiği rengin kodunu yazmış. Böylece renk seçimi yapabiliyorsunuz. Eğer binlerce veya milyonlarca renge ihtiyacınız yoksa size de yardımcı olabilir.
2) Bu enteresan renk paleti renk kodunu onaltılık sistemde html metin kutusuna atıyordu. Bende bunu aynı isimde asp.net metin kutusu ile değiştirdim.
<SCRIPT LANGUAGE=”JavaScript”>
function showColor(val) {
document.colorform.hexval.value = val;
}
</script>
bu şekilde olan javascript kodunda bir değişklik yapmadım, çalıştırdım ve javascriptin nesneye ulaşamadığını gördüm. Bende nesneye ID den ulaşmayı denedim.
<SCRIPT LANGUAGE=”JavaScript”>
function showColor(val) {
document.getElementById(’hexval’).value = val;
}
</script>
çalıştırdım ve yine nesneye ulaşamadım. Ufak bir araştırma sonunda javascriptten nesneye ulaşmak için ClientID özelliğini kullanmam gerektiğini öğrendim
<SCRIPT LANGUAGE=”JavaScript”>
function showColor(val) {
document.getElementById(’<%=hexval.ClientID %>’).style.backgroundColor = val;
document.getElementById(’<%=hexval.ClientID %>’).value = val;
}
</script>
ve bu kod ile nesneye ulaştım. Artık seçtiğim rengin kodunu aspx metin kutusuna javascript ile atabiliyordum.
Kaydetmek için butona bastım ve veritabanına gözattım. Her renk seçişimde metin kutusunun arkaplan rengi ve içeriği istediğim şekilde değişirken, renk kodunu kaydetmek istediğimde değeri göndermiyordu. Veritabanına daha önceden elle girdiğim ve sayfa ilk açıldığında ekrana gelen değer değişmemişti. Oysa ki ekranda değiştiği görülüyordu. Kayıt koduna durdurur (break point) koydum ve tekrar çalıştırdım. Durdurura geldiğimde yeni bir renk seçmiş olmama rağmen metin kutusunun içinde yeni rengin değerinin değil de eski rengin değerinin yazdığını gördüm. Nasıl oldu bilmiyorum, bu gibi durumlarda nedenin ne olduğunu anlamak için çok düşünürken bu kez birden viewstate aklıma geldi. Ben kaydetmek için butona bastığımda viewstate’deki değer (yani eski değer) veritabanına yazılıyordu. Çünkü; javascript sadece nesnenin değerini değiştiriyor, nesnenin sayfa ilk açıldığında sahip olduğu değeri tutan viewstate’e dokunmuyordu. Viewstate’i kapatmayı denedim ki denemez olaydım. Bu kez nesne üzerindeki değeri her sayfa yenilenişinde temizliyordu. “İyi ki viewstate varmış” diyerek eski haline getirdim. Başka bir yol olmalı diye düşündüm. Internet’te araştırırken hidden field önerileri gördüm ve onu denedim. Renk seçtiğim zaman değeri hidden field’a yazdım ve kaydet butonuna bastığım zaman içerisindeki değeri veritabanına yazdım. Böylece bu sorunu da çözmüş oldum.
Yani kodun son hali aşağıdaki gibi oldu.
<SCRIPT LANGUAGE=”JavaScript”>
function showColor(val) {
document.getElementById(’<%=hexval.ClientID %>’).style.backgroundColor = val;
document.getElementById(’<%=hexval.ClientID %>’).value = val;
document.getElementById(’<%=hidFldhexval.ClientID %>’).value = val;
}
</script>
3) İyi güzeldi de, kaydettiğim renk kodunu metin kutusunun BackColor (arka plan rengi) değerine atadığım zaman “stringi Color’a çeviremezsin” hatasını aldım. Evet BackColor değeri Color tipindeydi, benim elimdeyse onaltılık sistemde renk kodu vardı. Bunun çözümünün de şöyle olduğunu öğrendim. Color nesnesinin FromArgb metodu var. Verdiğiniz alpha, red, green, blue değerlerine göre size renk oluşturuyor. “Dene belki olur” diyerekten Int32 sınıfının Parse metodu ile elimdeki onaltılık renk kodunu çevirdim ve bu değeri FromArgb metoduna gönderdim.
hexval.BackColor = Color.FromArgb(Int32.Parse(BGColor.Replace(”#”, “”), NumberStyles.HexNumber)); // Onaltılık sistemdeki bir sayının içerisinde #(diyez) işareti olması ihtimalinden dolayı Replace metodu ile onları siliyoruz. NumberStyles.HexNumber ile gönderdiğimiz sayının tipini belirtiyoruz (Hexadecimal yani onaltılık sistemde bir sayı gönderiyoruz)
Sonuç mükemmele yakındı
istediğimi başarmıştım
Not : Renk paletini bulduğum yeri unuttuğum için kaynak gösteremedim ve burada yayınladım.
Slayt Gösterisi BaşlatYorum yok
Yorum yapHenüz yorum yok.
Yorumlar için RSS Sitenizden Geri izleme