6 Kasım 2008 Perşembe
18 Ekim 2007 Perşembe
CSS: Ne zaman ID ne zaman class kullanacağız ?
2-ID’ yi sayfanın temel yapısal elementleri için kullanın. (Header,footer,menu gibi)
15 Ekim 2007 Pazartesi
MDI Formlarda formun arkaplanını değiştirmek
Bu yazımda MDI formlarda parent formun arkaplan rengini değiştirmeyi anlatmaya çalışacağım. Eminim ki birçoğunuz parent formun arkaplan rengini ve ya resmini değiştirmeyi properties penceresinde ve kod tarafında denedi ama muhtemelen olmadı. Yaptığım bir projede bunu kullanmam gerekmişti. Aşağıdaki kodların işe yaramadığını görmüş olabilirsiniz. (Visual Studio .Net 2005’te öyle)
this.BackgroundImage = Image.FromFile("C:\\Resim.jpg"); this.BackColor = Color.Blue;
Ben yaptığım projede bazılarınızın da aklına geldiği gibi kalıtım kullandım. Ama kalıtımda da yukarıdaki kodları doğrudan yazınca (sadece renk değiştirmede) işe yaramıyor. Bunun için uyguladığım yöntemi kodları kısaltıp size aktarmak istiyorum.
İlk olarak MdiBackGround isimli yeni bir Windows projesi oluşturalım. Ve Form1’in kodlarını aşağıdaki gibi yazalım. (Form1 miras alınacak sınıf olarak kullanılacak)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace MdiBackGround
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
//if (!DesignMode)//eğer tasarım anında hata olursa bunu aktifleştirin.
PaintBackground(e.Graphics);
}
[DefaultValue(false)]
public new bool IsMdiContainer
{
get
{
return base.IsMdiContainer;
}
set
{
base.IsMdiContainer = value;
if (!value) return;
for (int i = 0; i < this.Controls.Count; i++)
{
MdiClient mdiClient = this.Controls[i] as MdiClient;
if (mdiClient != null)
{
mdiClient.Paint += new PaintEventHandler(this.MdiClient_Paint);
break;
}
}
}
}
private void MdiClient_Paint(object sender, PaintEventArgs e)
{
//if (!DesignMode)//eğer tasarım anında hata olursa bunu aktifleştirin.
PaintBackground(e.Graphics);
}
private void PaintBackground(Graphics g)
{
//this.BackgroundImage = Image.FromFile("C:\\Resim.jpg");
//Burada doğrudan bu yazılınca çalışıyor.
Rectangle rect = this.ClientRectangle;
rect.Inflate(2, 2);
SolidBrush sb = new SolidBrush(Color.Blue);
g.FillRectangle(sb, rect);
sb.Dispose();
}
}
}
Form’da ilk önce Form sınıfının OnPaint metodunu override ediyoruz. Bu sayede Onpaint metodunu kendi istediğimiz komutları gerçekleştirmek üzere değiştirebileceğiz. Daha sonra IsMdiContainer özelliğini yeniden oluşturuyoruz. Burada bu özelliği taban sınıf olan Form’dan alıyoruz ve formun bütün MdiClient’lerinin Paint olayına MdiClient_Paint metodunu atıyoruz. Peki, ne oluyor bu PaintBackground’da? Görüldüğü gibi extra bir şey yok. Formu kapsayan bir dörtgen SolidBrush ile çizdiriliyor. Şimdi miras alacağımız programa geçelim.
Programa yeni bir form ekleyelim ve IsMdiContainer özelliğini true yapalım. Bir tane MenuStrip ekleyelim ve Yeni adlı bir menü butonu koyalım. Menü butonuna çift tıklayıp aşağıdaki kodları yazalım. Tabi öncesinde programa yeni bir form ekleyelim. (Bu yavru form olacak.)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace MdiBackGround
{
public partial class Form2 : MdiBackGround.Form1//Miras alınıyor.
{
public Form2()
{
InitializeComponent();
}
private void yeniToolStripMenuItem_Click(object sender, EventArgs e)
{
Form form = new Form3();
form.MdiParent = this;
form.Show();
}
}
}
Gördüğünüz gibi OnPaint olayını override edip, IsMdiContainer özelliğini yeniden oluşturmaktan başka yaptığımız hiç bir şey yok. Buradaki önemli nokta MdiClient’lere MdiClient_Paint özelliğini vermek.
Bu yazımda size MDIParent’lere arkaplan verme hakkında bilgi vermeye çalıştım. Sormak istediğiniz bir şey varsa bana mail atabilir ya da bu yazı için yorum yapabilirsiniz. Ayrıca hatalarımı da bildirirseniz memnun olurum.
Yazar: Tayfun Taşkın
Sql Server 2005'te Veritabanı Tablolarını Listelemek
Bu yazımda sizlere MS SQL Server’da oluşturduğumuz bir veritabanının içindeki tabloları ve seçtiğimiz bir tablonun içindeki alanları listeleyen bir program anlatmaya çalışacağım.
Her şeyden önce böyle bir şeye neden ihtiyacımız olur onu anlatmaya çalışayım. Diyelim ki Microsoft’un sorgu oluşturma arayüzü olan SQL Server Management Studio’daki Query Builder’i ya da piyasadaki diğer programları beğenmiyorsunuz.(Ben böyle bir şey demedim ) Ya da kendinize ait bir Query Builder yapmak istiyorsunuz. O zaman böyle bir şeye ihtiyacınız düşecektir. Staj yaptığım yerde benden böyle bir şey yapmam istenmişti. Ben ORACLE ile yapmıştım ama arada hiçbir fark yok. Tek değişen sorgu cümleleri. Server’a uygun sorguyu gönderdikten sonra size sadece verileri düzenlemek kalıyor.
Programda iki adet DataGridView olacak. Birincisinde veritabanındaki tablolar listelenecek, ikincisinde ise birincide seçilen tabloya ait alanlar listelenecek. Aşağıdaki kodları programımıza ekleyelim.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace TabloIslemleriSQL
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string conStr = "DATA SOURCE=.; INITIAL CATALOG = veritabani; USER ID = tayfun; PASSWORD = tayfun; INTEGRATED SECURITY = TRUE";
SqlDataAdapter adp;
DataTable dt;
SqlConnection sqlCon;
private void Form1_Load(object sender, EventArgs e)
{
try
{
dt = new DataTable();
string sorgu = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME != 'sysdiagrams'";
sqlCon = new SqlConnection(conStr);
adp = new SqlDataAdapter(sorgu, sqlCon);
adp.Fill(dt);
dgrdTablolar.DataSource = dt;
}
catch { }
}
private void dgrdTablolar_SelectionChanged(object sender, EventArgs e)
{
try
{
dt = new DataTable();
string tabloAdi = dgrdTablolar.CurrentRow.Cells[0].Value.ToString();
string sorgu = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" + tabloAdi + "'";
adp = new SqlDataAdapter(sorgu, sqlCon);
adp.Fill(dt);
dgrdAlanlar.DataSource = dt;
}
catch { }
}
}
}
İlk olarak ConnectionString, DataAdapter, DataTable tanımlıyoruz. Ben daha önce oluşturduğum veritabanını seçtim. Form load olayında yazdığımız sorguya göre veritabanımızdaki tablolar listeleniyor. Tablo isimlerini “INFORMATION_SCHEMA.TABLES” içinden çekiyoruz. Sorguda “TABLE_NAME” ile tablolar listeleniyor, “BASE TABLE” veritabanımızdaki tabloları diğer nesnelerden (View gibi nesneler) ayırıyoruz. Ve ayrıca tablo olarak görünen sistem diyagramları tablosundan (sysdiagrams) ayırıyoruz. Sorguyu çektiğimizde gelen verileri dgrdTablolar DataGridView’ine kaydediyoruz.
dgrdTablolar’ın SelectedChanged olayında seçilen tabloya ait alanların listelenmesi için gönderdiğimiz sorguda tablo adını vermemiz yeterli. Tablo alanlarını “INFORMATION_SCHEMA.COLUMNS” içinden çekiyoruz. Ve gelen verileri dgrdAlanlar DataGridview’ine kaydediyoruz.
Sorgularda “*” yazarak veri çekmemiz durumunda hangi verileri çekebileceğimizi görürüz. Örneğin “COLUMN_NAME” yanında “DATA_TYPE” yazarak alanın veri tipini de çekebiliriz.
Oracle'daki Sorgular:
Oracle’da MS SQL Server’dan farklı olarak veritabanı yerine şemalar var, “SCHEME” olarak geçiyor. Tablo isimlerini ve alan isimlerini listeleyen sorgular aşağıdaki gibidir:
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'veritabani'
SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE OWNER = 'veritabani' AND TABLE_NAME = 'TABLOADI'
Burada “OWNER” ile şema (veritabanı) ismi veriliyor.
Gördüğünüz doğru sorgu cümlelerini bulduktan sonra yapamayacağımız bir şey yok. Şöyle ki; kullanıcının sistem zamanını değiştirmesi olasılığına karşı Server’dan sistem zamanını çekmek istiyorsunuz. Bunu;
SELECT GETDATE() AS [Tarih Ve Saat]
Sorgusuyla yapabilirsiniz. Böylelikle muhtemel bir hatanın önüne geçebilirsiniz.
Bu yazımda size hazırladığımız veritabanlarının, tablolarının ve alanlarının isimlerini listeleme hakkında bilgi vermeye çalıştım. Sormak istediğiniz bir şey varsa bana mail atabilir ya da bu yazı için yorum yapabilirsiniz. Ayrıca hatalarımı da bildirirseniz memnun olurum.
Yazar: Tayfun Taşkın
Netron Staj Değerlendirmesi (mtcakmak)
- Sistemin analizinde çalışan tek bir yazılımcı sayesinde maliyet düşüyor. Ekibe sonradan gelen yazılımcılar sadece dökümanları okuyarak projeye kolaylıkla dahil olabiliyor.
- Proje yazılmaya başlamadan önce kesin çizgilerle kapsam belirlenmiş oluyor ki Proje Yönetimi açısından bu çok kritik.
- Müşteri tarafından imzalanmış bir Kapsam dökümanı; daha ilerde "Şunu da projeye ekleyin" diyen müşteriyi;"Anlaşmamız bu şekildeydi." diyerek durdurabilmenizi sağlar.
Neyse biz son haftamızı PoC(Proof Of Concept)* çalışmaları ile geçirdik. Ben SQL Server Replication üzerine devam ederken; Harun Developer Express UI komponentleri ile esnek ve kullanışlı bir arayüz geliştirmek üzerine çalıştı. Barış da NHibernate(bir tür Dynamic SQL aracıdır) üzerine çalışma yaptı.
Sql Server Replication'ı basit olarak şu şekilde açıklayabilirim. Bir veritabanının birden fazla makinada bulunan Sql Server'lar ile eşleltirilmesi... Bu projedeki ihtiyaç ise şu şekildeydi: Bayiler çeşitli nedenlerle uzun süreli merkeze bağlantıları kesilebiliyor(Mesela 1 hafta);
Bu süre boyunca veritabanın kendi makinası üzerinde bulunan bir kopyası ile tüm eski kayıtlara(Mesela hangi servislerde hangi parçalar üzerinde hangi işlemler gerçekleştirilmiş) ulaşabilecek; ya da sistem aracılığıyla satış yapabilmesi isteniyordu. Bağlantı geri geldiğinde ise tüm clientlardaki tüm verilerin (Üzerinde yapılan Update, Insert, Delete gibi işlemlerin sonuçlarındaki veritabanının)tekrar eşleştirilmesi isteniyordu. Bunun için bir örnek simüle etmeye çalıştım. Çok da başarılı olduğumu söyleyemem. 10 sayfalık bir döküman teslim etmeme rağmen stabil olarak çalıştığını ispatlayamadım.
Bu stajda; Çok katmanlı Mimarinin önemini ve İleri Nesneye Dayalı Tasarımın(Design Patterns) gerekliliklerini öğrendik. Programlama Dillerinin amacı gerçekleştirmekte sadece bir araç olduklarını öğrendik. Son öğrendiğimiz şey ise piyasada her zaman çok farklı sistemlerle karşılaşabileceğimiz ama bizim Marka bağımsız olmamız gerektiğiydi.
Sizlere yararlı olması dileğiyle; herkese iyi tatiller,stajlar, çalışmalar vb...
*: Bir yazılım projesinde analiz sonucunda kullanılması planlanan Tekniklerin çalışma ve/veya uygulanabilirlik ayrıntılarını öğrenmek için küçük çaptaki gerçekleştirimlerdir(simulasyonlardır).
Yazar: M. Tahir Çakmak
C#'ta Otomatik Form Submitting
HttpWebRequest hWebReq = (HttpWebRequest)HttpWebRequest.Create(http://jafa.burnham.org/newSession.html);
HttpWebResponse hWebResp;
hWebReq.Method ="POST";
hWebReq.Referer =http://jafa.burnham.org/newSession.html;
//7d714.. şeklinde bilgileri de içeren yukarda belirtilen dosya, formun submit edilme anında ethereal ile yakalanmış
byte[] bf = File.ReadAllBytes(@"C:\myReq.txt");
hWebReq.ContentLength = bf.Length;
hWebReq.ContentType = "multipart/form-data; boundary=---------------------------7d7148ee0142";// Son Bulunan Nokta
hWebReq.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, */*";
hWebReq.Headers.Add("Cookie", webBrowser1.Document.Cookie);
hWebReq.GetRequestStream().Write(bf, 0, bf.Length);
hWebResp = (HttpWebResponse)hWebReq.GetResponse();
Stream str = hWebResp.GetResponseStream();
byte[] buf = new byte[20000];
//İlk oluşturmada string nesnesinin bir sorunu vardı; tüm bilgileri koyamadık; bu yüzden multiline bir textBox'ın içerisine 2 defada veriyi bastık, sonra geri aldık. O yüzden 2 defa tekrarlanıyor.str.Read(buf, 0, buf.Length);
str.Flush();
textBox1.Text = Encoding.ASCII.GetString(buf);
buf.Initialize();
str.Read(buf, 0, buf.Length);
textBox1.Text += Encoding.ASCII.GetString(buf);
string strPage = textBox1.Text;
string substrP = strPage.Substring(strPage.IndexOf("/result.html?ID="),"/result.html?ID=d398f118d3100146de4252289e68432a".Length );
substrPage = substrP.Substring("/result.html?ID=".Length, 32);
textBox2.Text = substrPage;
string strur = "http://jafa.burnham.org/result.html?ID=" + substrPage;
webBrowser2.AllowNavigation = true;
webBrowser2.Navigate(strur);
Yazar: M. Tahir Çakmak
Ajax Nedir?
Bu yazıda son 1 yılda adından sıkça bahsettiren AJAX teknolojisi hakkında bilgi vermeye çalışacağım.
AJAX (Asynchronious Javascript And XML) 'ı bir internet sayfasının asenkron (yani sayfanın genel işleyişini durdurmadan) harici bir internet sayfasına kaynak olarak başvurması olarak tanımlayabiliriz. Tarayıcımızda açık olan bir sayfa, XMLHttpRequest adı verilen bir parçacık yardımıyla asenkron olarak başka bir web sayfasını çağırır. Çağırılan web sayfası ise geriye bir XML sayfası döndürür ve biz de bu XML dosyasını Javascript komutlarıyla parse ederek (yani XML dosyası içerisinden verileri çekerek) elde ettiğimiz verileri yine Javascript komutlarıyla açık olan web sayfasında uygun gördüğümüz yerlere yerleştiririz.
Peki neden AJAX? Neden ASP.NET 2.0 ın çok gelişmiş GridView gibi özelliklerini kullanmıyoruz da herşeyi elle programlamamız gereken bir işe bulaşıyoruz? Cevabı çok basit: Dinamik bir kullanıcı arayüzü, kasılmayan bir internet bağlantısı ve sunucuyu yormayan ve sunucunun aynı çalışmayla daha fazla isteğe cevap verebilmesini sağlamak.
Klasik bir ASP.NET sayfasında yaptığınız her istekte size bir sayfa gönderilir. Bu birçoğunuza pek önemli değil gibi gelse de bir tarafa dikkatinizi çekmek istiyorum: Her gelen web sayfasında değişmeyen birçok bölüm (menü, başlık, vs.) yeniden gönderilir ve daha önemlisi bu kısımların da sunucu tarafında derlenerek yollanmasıdır. Kısacası bu sistemde tüm yükü sunucu çekmektedir. İstemci sadece sayfa isteğinde bulunur ve gelen sayfayı kullanıcıya gösterir. Peki AJAX'ta bu sistem nasıl işlemekte? AJAX'ta ASP.NET sayfalarını bir xml sağlayıcısı olarak kullanıyoruz. Sayfaya istek geldiğinde, sayfa url'sindeki querystringleri kullanarak kendisi için gerekli olan verileri alır, işler ve sonuçta geriye verinin düzgün olarak formatlanmış hali olan xml sayfasını döndürür. Dikkat ederseniz burada verileri ekranda göstermeyi sağlayan hiçbir ASP.NET kontrolünü (GridView gibi) kullanmadık. Peki biz bu verileri nasıl göstereceğiz? Burada client tarafında programlama yapabileceğimiz Javascript devreye giriyor. Dönen xml dosyalarının düğümlerinde (node) hareket ederek verileri sistemli bir şekilde elde ediyor, dahs sonra bunları sayfada önceden belirlediğimiz yerlere yerleştiriyoruz. Göründüğü gibi sunucunun yapmış olduğu veriyi sayfaya yerleştirme işlemini biz istemciye bırakarak sunucuyu büyük bir yükten kurtardık. Ayrıca dönen değer salt veri olduğu için sunucunun bant genişliği problemini de azaltmış ve daha fazla isteğe cevap verebilecek hale getirmiş olduk.
Peki AJAX programlaması yapmak için neler gereklidir? Bir server-side programlama dilini (tercihen C#) en azından basit bir web sayfası yapacak kadar bilmek, biraz xml ve biraz da Javascript bilgisi yeterlidir.
Bunların dışında bazı konular hakkında ben biraz bilgi versem iyi olur kanaatindeyim: Bir web sayfası için istek yaptığınızda karşı taraftan gelen cevapta size gönderilen sayfanın içerik tipi (Content-Type) gönderilir. Normal şartlarda bu değer text/html dir. Ama bizim sunucudan istediğimiz şey bir XML sayfası olduğundan Content-Type'ı text/xml olarak değiştirmemiz gerekmektedir.
İsterseniz konunun daha rahat anlaşılabilmesi için bir örnek üzerinde devam edelim:
İlk örneğimizde (herzaman tüm kitaplardaki ilk örnek olduğu için) bir Merhaba Dünya uygulaması geliştirelim.
Adım 1. Visual Studio 2005'te yeni bir web sitesi yaratalım, Location olarak File System, Language olarak C# seçili olsun.
Adım 2. Solution Explorer'dan projemize yeni bir aspx sayfası ekleyelim:
Adım 3. Şimdi işin ilk adımı olarak veri sağlayıcımızı yani aspx sayfasını yazacağız.
Adım 3.1. İlk olarak sayfamız kendisine bir AJAX isteği geldiğinde gelen verileri işler. Ama örneğimiz bir Merhaba Dünya uygulaması olduğundan sadece geriye ufak bir xml dosyası göndermekle yetineceğiz. Öncelikle istemciye vereceğimiz cevabı aspx sayfamıza otomatik olarak yerleştirilmiş xhtml kodlarından arındırmamız gerekiyor. Daha sonra ise cevabımızın içerik tipini belirledikten sonra buffer özelliğini kapatmamız gerekiyor. Tarayıcılar, sayfaları önbelleklerine aldıklarında o sayfada değişiklik olmadığı sürece istemciye hep önbellekteki sayfayı gösterirler, aksini belirtmediğiniz takdirde. İşte bu aksi durumu 3. satırdaki kod ile sağlıyoruz. AJAX dinamik bir yapı ve dinamik olarak veri alımı zorunlu olduğu için buffer kontrolü işimize gelmez.
Response.Clear(); //Cevabı Temizle
Response.ContentType = "text/xml"; //Cevabın tipini belirle
Response.Expires = 0; //Buffer kontrolünü devre dışı bırak
Adım 3.2. Artık xml dosyamızı oluşturmaya başlayabiliriz: Öncelikle ihtiyacımız olan nesneleri kullanabilmek için sayfanın en üstüne şu satırı eklememiz gerekmekte:
using System.Xml;
Daha sonra ise bir XMLTextWriter tanımlayarak yeni bir dökümana başlamamız gerekmektedir. Bu tanımlamada dikkat edilmesi gereken iki parametre var: Birisi Response.OutputStream (cevabımızın Stream hali, bkz CSharpNedir.com - Streamler), bir diğeri ise System.Text.Encoding.GetEncoding("windows-1254") (Türkçe karakter desteklemesi için gerekli olan dil kodlaması) dır.
XmlTextWriter yaz = new XmlTextWriter(Response.OutputStream, System.Text.Encoding.GetEncoding("windows-1254"));
yaz.WriteStartDocument();
Daha sonra xml dosyamızın root elementini tanımlayacağız:
yaz.WriteStartElement("Basla");
Şimdi Merhaba Dünya yazısını yazmanın vakti geldi:
yaz.WriteString("Merhaba Dünya");
Başladığımız elementi ve dökümanı sırasıyla kapatalım. Unutmayın, xml çok katı kuralları olan bir dildir ve html ile aynı tabandan gelmesine rağmen aynı toleransı tanımaz. Bu yüzden açtığınız her elementi ters sırayla kapatmak zorundasınız.
yaz.WriteEndElement();
yaz.WriteEndDocument();
Daha sonra ise XMLTextWriter'ımızı ve cevabımızı bitireceğiz:
yaz.Close();
Response.End();
XML dosyamızın görüntüsü şu şekilde olacaktır:
Adım 4. Artık veri sağlayıcımız hazır olduğuna göre XML dosyamızı parse etme işlemine başlayabiliriz. Öncelikle projemize bir html sayfası ve bir Javascript dosyası ekliyoruz:
Daha sonra ise XMLHttpRequest nesnemizi aşağıdaki fonksiyon yardımıyla oluşturuyoruz:
function getXMLHttpRequest(){
var httpRequest = null;
try { httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e) {
try { httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) { httpRequest = null;}
}
if (!httpRequest && typeof XMLHttpRequest != "undefined")
httpRequest = new XMLHttpRequest();
return httpRequest;
}
Bu kod sayesinde XMLHttpRequest nesnemizin hem Internet Explorer'da hem de Firefox gibi Gecko tabanlı tarayıcılarda düzgün çalışmasını sağlıyoruz. Daha sonra ise parse işlemine geçmeden önce ufak bir işlem için bir fonksiyon tanımlamamız gerekmekte: Whitespace temizleme. Bir xml veya html belgesinde ifade edilemeyen bazı karakterler bulunur. Bunlar enter, tab gibi karakterlerdir ve maalesef bunları temizlemediğimiz takdirde bazı tarayıcılar bunları da element olarak kabul etmektedirler. Aşağıdaki kod bloğuyla bu işi de halletmekteyiz:
function removeWhitespace(xml)
{
var loopIndex;
for (loopIndex = 0; loopIndex <>
{
var currentNode = xml.childNodes[loopIndex];
if (currentNode.nodeType == 1)
{
removeWhitespace(currentNode);
}
if (((/^\s+$/.test(currentNode.nodeValue))) && (currentNode.nodeType == 3))
{
xml.removeChild(xml.childNodes[loopIndex--]);
}
}
}
Daha sonra hem IE de hem Firefox'ta verileri sorunsuz parse etmek için ufak bir fonksiyonumuz daha var:
function myNodeValue(myXmlText){
return (myXmlText.textContent|| myXmlText.innerText || myXmlText.text);
}
Ve geldik en önemli yere: XMLHttpRequest.onreadystatechange! Bu önemli olay, bize birçok kolaylık tanımakta. Bir XMLHttpRequest yollandığında XMLHttpRequest.readyState değeri verinin o anki durumuna göre değişik değerler alır:
0 = Hazır Değil
1 = Yükleniyor
2 = Yüklendi
3 = İnceleniyor
4 = Tamamlandı
Bizim için burada önemli olan değer 4. Çünkü biz verimiz tam olarak yüklendiğinde parse işlemine başlayacağız. Ayrıca HTTP protokolünün status değerlerini de kontrol etmemiz gerekmekte. Bunlara fazla değinmeyeceğim. Sadece kodlarını yazacağım:
200 - OK
404 - Sayfa Bulunamadı
403 - Yetkisiz Giriş Talebi
500 - Sayfa Hatası
Bunlardan da ihtiyacımız olan değer 200, çünkü bizim verimizi aldığımızdan emin olmamız gerekiyor. Aşağıda standart bir parser çağırıcı fonksiyonun şablonunu bulunmakta.
function AJAXOrnek()
{
var xmlRequest = getXMLHttpRequest();
xmlRequest.onreadystatechange = function()
{
if(xmlRequest.readyState == 4){
if(xmlRequest.status == 200){
var doc=xmlRequest.responseXML.documentElement;
removeWhitespace(doc);
MyParser(doc); //Burada verimizi parse edecek fonksiyonumuzu çağıracağız
}
else{
alert("Data erişiminde hata!"+xmlRequest.status );
}
}
}
xmlRequest.open("POST", "ajax.aspx", true);
xmlRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
xmlRequest.send(null);
}
Artık parser fonksiyonumuz olan MyParser'ı yazmaya başlıyoruz:
function MyParser(doc)
{
var mesaj = myNodeValue(doc.childNodes[0]);
alert(mesaj);
}
Fonksiyonumuz gelen xml verimizin root elementi olan taglarına childNodes değeri ile eriştikten sonra myNodeValue fonksiyonuyla içeriğini bir alertbox'a basmakta. Eğer daha karmaşık bir xml dosyası hazırladıysanız ve içiçe taglarınız varsa, childNodes'u kullanarak hepsine ulaşabilirsiniz. Bu özelliği aynı bir dizideki gibi kullanıyoruz.
En son olarak ajaxornek.htm'i de aşağıdaki şekilde yapılandırdıktan sonra test işlemine başlayabilirsiniz:
Sonuç olarak aşağıdaki gibi bir görüntü elde etmeniz gerekmekte:
Umarım işinize yarar. Teşekkürler.
Yazar: Harun Yiğit LEGOZ