Coder

25 Nisan 2013

Dropdownlist ve Gridview uygulaması

Asp.net ile geliştirilen web uygulamaların da dropdownlist ve gridview bir arada her zaman ihtiyaç duyularak kullanılmıştır. Bu kontrollerin yer aldığı dropdownlist’in gridview ile bağlantılı bir uygulama yapalım.

dropdownlist-gridview-uygulamasi

Örneğimizdeki senaryo şöyle olsun; üniversitenin kampüslerindeki bölümler ve o bölümlerde derslerin kredilerini görebileceği, veritabanı kısmında okul-bölüm-ders ilişkisinde geçen, kullanıcının dropdownlist de seçeceği okulun tekrar dropdownlist ile seçeceği bölümündeki ders kredilerinigridview de görebileceği mini rapor ekran yapısını uygulayalım.

İlk önce veritabanı tarafında 3 tane tablo oluşturalım. Tablolarımız isim ve sırasıyla tblOkul, tblOkulBolum, tblBolumDers.

Tablo yapısı ve kolon özellikleri

tablo-yapisi

Resimdeki gibi tabloları; değişken tiplerini, isimlerini ve primary key olan id kolanlarının Identity Column özelliğini id olarak atayarak oluşturun.

Oluşturulan tabloları aşağıdaki diyagram resmindeki gibi ilişkilendirin. tblOkul tablsundaki id ile tblOkulBolum tablosundaki okulu kolonu, tblOkulBolum tablsundaki id ile tblBolumDers tablosundaki bolumu kolonu ilişkilendirilmiş. Resim üzerinde de anlaşılması için mavi oklu kolonlar ile kırmızı oklu kolonlar ilişkilendirilmiş.

İlişkilendirilmiş tablolar diyagram ekranı
tablo-iliskilendirmesi

İlişkilendirme de yaptıktan sonra kolonlara veri girişi yapabiliriz. Hayali olarak kampüs ve ilgili bölümlerini aşağıdaki resimdeki gibi doldurdum. Tabloları sırasıyla tblOkul, tblOkulBolum, tblBolumDers şeklinde doldurun.(Tablolardaki id ler otomatik artacağından o kısma isteseniz de veri girişi yapamazsınız.)

Veritabanındaki tablo içeriği
tablo-icerigi-girilmesi
Tablolarımız birbirleri ile ilişkilendirildiği için okulu ve bölümü kolonlarını sadece ilgili tablosundaki numarasını yazıyoruz. (Yeni başlayanlar için önerim, resimdeki ve yazdığım tablo isimleri gibi birebir giriş yaptıklarında kod tarafında da fazla bir şey değiştirmeden hata almadan örneği çalıştırabilir.)

Veritabanı tarafını yaptıktan sonra Asp.net tarafına geçebiliriz. Yeni proje oluşturduktan sonra ilk önce web.config dosyamıza veritabanı bağlantımızı alttaki gibi belirlenen kod blogu aralığına yazalım. Burada kendi veritabanınızı kullanacağınız için, veritabanı ismi ve diğer kısımlara takılmamanızı ümit ediyorum.(Local de kod isimini verdiğim veritabanımı kullanıyorum)

Web.config dosya içerği

webconfig-connectionstring

Tasarım kısmında görseldeki gibi ekran hazırlayalım. Kullandıklarım, 2 adet dropdownlist , 1 buton, 1 gridview. Dropdownlist kontrollerinin AutoPostBack özelliğini true yapmayı unutmayın !

Asp.net tasarım ekranı

aspnet-sayfa-duzeni

Tasarım kısmını da bitirdikten sonra kod kısmına geçebiliriz. İlk önce sayfanın  Page_Load kısmından sayfa ilk açıldığında veritabanındaki okul isimlerinin başlangıçta 1. dropdownlist temize gelmesini istiyoruz. Diğer açıklamaları da kod kısmında bulabilirsiniz.

Eklemeyi unutmayın !
[cc lang='csharp' ]using System.Configuration;
using System.Data.SqlClient;
using System.Data;[/cc]

[cc lang='csharp' ]
string constr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString; // Bağlantı satırını global tanıplayıp tekrar tekrar yazma ihtiyacı duymuyoruz.
protected void Page_Load(object sender, EventArgs e)
{
// Dropdownlist kontrol isimlerini ddOkul ve ddBolum olarak atadım !
// Sayfa açılır açılmaz tblOkul tablomuzdaki okul isimlerini ddOkul(dropdownlist) kontrolümüze veritabanımızdan çekiyoruz.
if (!IsPostBack)
{

SqlConnection sql = new SqlConnection(constr);
SqlCommand com = new SqlCommand(“Select id, okul from tblOkul”, sql);

try
{
sql.Open();
SqlDataReader reader = com.ExecuteReader();

ddOkul.DataSource = reader;
ddOkul.DataValueField = “id”;
ddOkul.DataTextField = “okul”;
ddOkul.DataBind();
reader.Close();
}

catch
{
Response.Write(“Bir hata oluştu”);
}

sql.Close();
}
}

protected void ddOkul_SelectedIndexChanged(object sender, EventArgs e)
{

// Seçilen okul karşılığında önceden veritabanımız da kayıtlı bulunan okuldaki bölümler, ddBolum(dropdownlist) kontrolümüz de listelenencek.
SqlConnection sql = new SqlConnection(constr);
SqlCommand com = new SqlCommand(“Select id, bolum from tblOkulBolum where okulu=’” + ddOkul.SelectedItem.Value +”‘”, sql);

try
{
sql.Open();

SqlDataReader reader = com.ExecuteReader();

ddBolum.DataSource = reader;
ddBolum.DataValueField = “id”;
ddBolum.DataTextField = “bolum”;
ddBolum.DataBind();
reader.Close();
}

catch
{
Response.Write(“Bir hata oluştu”);
}

sql.Close();

}

protected void btnListele_Click(object sender, EventArgs e)
{

SqlConnection sql = new SqlConnection(constr);
SqlCommand com = new SqlCommand(“Select dersler, kredi from tblBolumDersler where bolumu=’” + ddBolum.SelectedItem.Value + “‘”, sql);

try
{
sql.Open();

SqlDataReader reader = com.ExecuteReader();

DataTable tablo = new DataTable();
tablo.Load(reader);
GridView1.DataSource = tablo.DefaultView;
GridView1.DataBind();

reader.Close();
}

catch
{
Response.Write(“Bir hata oluştu”);
}

sql.Close();
}[/cc]
Burada bazı bölümlerin dersleri gridview kontrolünde göstermeyebilir. Sadece Maltepe MYO okulundaki Bilgisayar ve Muhasebe derslerini verirabanımıza kayıt ettiğimiz için örneğimizde sadece 2 bölümün dersleri göstermekte.

13 Nisan 2013

Zamanlı bilgisayar işlem programı

Her junior yazılımcının karşılaşacağı ödev babında program ile merhaba. BEnzer konu her ne kadar paylaşılmışsa da alternatif olarak paylaşmak istedim.

otomatik-bilsiyara-kapatma-programi

Aşağıdaki bağlantıdan indirebileceğiniz zamanlı bilgisayar işlem programı ile bilgisayarı belirlediğiniz zaman kapatıp veya yeniden başlatabilirsiniz. Yada resimdeki gibi bir form ekranı tasarlayarak alttaki kodlar yardımı ile yapabilirsiniz.

[wpdm_file id=11]

Form tasarlarken kullandığım kontroller; birkaç label, buton, maskedtextbox(zamanı saat ve dakika formatın da girebilmek için), datetimepicker, radiobuton, timer ve notifyicon. Yaptığım işlemleri kod tarafına geçmeden adım adım anlatırsam konuyu daha verimli aktaracağımı düşünüyorum;

  • Anlık zamanı gösterebilmek için timer kontrolünün tick olayına bir label a anlık saati gösterdik. Timer ın Interval değerini 1000 yaparak saniyede bir anlık saati label da otomatik gösterdik.
  • Zamanlayıcı çalıştırmak için ilgili buton yardımı ile maskedtextbox ve datetimepicker seçilen değeri metod yardımı ile datetime tipli değişkene atadık. Zamanlayıcı çalıştırmak için eklenen timer ı aktif ettik.
  • Aktif edilen zamanlayıcı timer ı her saniyede bir şimdiki zaman(saat) ile ayarlanan saati karşılaştırdık.
  • Ayarlanan zaman ile şimdiki zaman eşit ise radiobuton da seçilen işlemi yapmasını istedik.
  • NotifyIcon kontrolü ile programı yani formu gizlediğimiz de sağ alt köşede mesaj iletisi vermesi için ayarladık.

[cc lang='csharp' ] private void tmrSimdikiZaman_Tick(object sender, EventArgs e)
{
lblSimdikiSaat.Text = DateTime.Now.ToLongTimeString();
}

DateTime alarmZamani;
DateTime ayarZamani;
private void btnKur_Click(object sender, EventArgs e)
{
if (txtSaat.Text == “”)
{
MessageBox.Show(“Girilen değerleri kontrol et \n Alanlardan herhangi birini boş bırakma !”);
return;
}
else
{

alarmayar(dateTimePicker1.Value.Date);
}
}

private void alarmayar(DateTime zaman)
{

alarmZamani = zaman;
alarmZamani = alarmZamani.AddHours(Convert.ToInt32(txtSaat.Text.Substring(0, 2)));
alarmZamani = alarmZamani.AddMinutes(Convert.ToInt32(txtSaat.Text.Substring(3, 2)));

if (DateTime.Now >= alarmZamani)
{
MessageBox.Show(“Geçmiş zamana alarm kuramazsınız !!!”);
return;
}
else
{

tmrAlarmZamani.Enabled = true;
btnKur.Enabled = false;
if (rbKapat.Checked == true)
{
lblMesaj.Text = “Bilgisayar ” + txtSaat.Text + ” zamanına kapatılması için ayarlandı.”;
}
else if (rbYeniden.Checked == true)
{
lblMesaj.Text = “Bilgisayar ” + txtSaat.Text + ” zamanına yeniden başlatılması için ayarlandı.”;
}
else
{
lblMesaj.Text = txtSaat.Text + ” için herhangi bir görev ayarlanmamış”;
}
}
}

private void tmrAlarmZamani_Tick(object sender, EventArgs e)
{
ayarZamani = DateTime.Now;

if (ayarZamani.ToString() == alarmZamani.ToString())
{
tmrAlarmZamani.Enabled = false;

if (rbKapat.Checked)
{
notifyIcon1.BalloonTipText = “Bilgisayarınız kapatılıyor…”;
notifyIcon1.ShowBalloonTip(3);
System.Diagnostics.Process.Start(“shutdown”, “-s -f -t 0″);
}
else if (rbYeniden.Checked)
{
notifyIcon1.BalloonTipText = “Bilgisayarınız yeniden başlatılıyor…”;
notifyIcon1.ShowBalloonTip(3);
System.Diagnostics.Process.Start(“shutdown”, “-r -f -t 0″);
}
else
{
lblMesaj.Text = “Zaman Geldi”;
notifyIcon1.BalloonTipText = “Zaman Geldi”;
notifyIcon1.ShowBalloonTip(5);
}

}
}

private void btnIptal_Click(object sender, EventArgs e)
{
tmrAlarmZamani.Enabled = false;
btnKur.Enabled = true;
rbYeniden.Checked = false;
rbKapat.Checked = false;
lblMesaj.Text = “Herhangi bir görevi yok !”;
}

private void Form1_Resize(object sender, EventArgs e)
{
if (FormWindowState.Minimized == WindowState)
{
Hide();
notifyIcon1.BalloonTipText = lblMesaj.Text;
notifyIcon1.ShowBalloonTip(5);
}
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (tmrAlarmZamani.Enabled == true)
{
if (MessageBox.Show(“Zamanlandırlmış bir görev olduğu için uygulama kapatılamıyor. \nUygulamayı ve görevi kapatmakta karalımısınız ?”, “Uyarı !”, MessageBoxButtons.YesNo) == DialogResult.Yes)
{
Application.Exit();
}

}
}

private void notifyIcon1_Click(object sender, EventArgs e)
{
this.Show();
WindowState = FormWindowState.Normal;
}[/cc]

08 Nisan 2013

App.Config nasıl eklenir ve kullanılır

Veritabanı ile haşır neşir projelerimizde veritabanı ile uygulamayı bağlamak için(database adı, kullanıcı adı, şifre vs.) bir veya birkaç yerde Connectionstring kullanırız. Bu gibi durumlarda hem güvenliği arttırmak hemde iş yükünü azaltmak için App.Config kullanımı çok önemlidir.

App.Config kullanımı hakkında fazla söz etmeden nasıl kullanırız görelim. Oluşturduğumuz masaüstü projemize App.Config dosyası yoksa ekliyoruz. Dosya içindeki connectionStrings etiketleri arasına aşağıdaki gibi ilgili yerlere bilgileri yazıyoruz.

[cc lang='xml' ]


[/cc]

system-configuration-ekleme

Proje içinde herhangi bir formda bağlantıyı kullanabilmek için App.Config’e bağlantı ismi ile aşağıdaki gibi çağırıyoruz. Bunu yapmadan önce System.Configuration referansını eklemeyi unutmayın…

[cc lang='csharp' ]SqlConnection sql = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ConnectionString);

//… bağlantıdan sonra geri kalan işlemler. [/cc]

Hali hazırda yapılan örneği aşağıdaki bağlantıdan indirebilirsiniz.

[wpdm_file id=10]

06 Nisan 2013

Listview eleman ekleme sıralı silme

Listview’i sevenler derneği açılsa üye olan ilk insan ben olurum herhalde. Bir kontrol bu kadar sevilmez… Neyse konuya dönelim, database den listview çekilen onlarca veri içinde listview üzerinden silme işlemi yaptığınızda db den verinin silindiğini gösterebilmek için listview i bir şekilde yenileriz.

Listview üzerin herhangi bir elemanı sildikten sonra focus alanı listview listesinin en başındaki elemana focuslanır. Örnek verecek olursak, e-posta adresimizdeki 30. sıradaki bir maili sildiğimizde otomatik olarak bir sonraki mail işaretlenir yani focus olur. Ancak bu olay listview de müdahele etmeden yapılamıyor.

listview-eleman-ekleme-silme

Mevzuyu anlatabildiysem listview e eleman nasıl eklenir, nasıl silinir, silinen elemandan sırasına göre elemana nasıl focus edilir görelim. Resimdeki gibi bir form ekranı düzenleyip listview e eleman ekleme kodu ile başlayalım.

Listview e eleman eklemek için;
[cc lang='csharp' ] private void btnEkle_Click(object sender, EventArgs e)
{
ListViewItem lv = new ListViewItem();
lv.Text = txtAdi.Text;
lv.SubItems.Add(txtSoyadi.Text);
listView1.Items.Add(lv);
}[/cc]

Listviewden sıralı eleman silmek için;
[cc lang='csharp' ] private void btnSil_Click(object sender, EventArgs e)
{
int secilenEleman = 0;
if (listView1.Items.Count > 0)
{
secilenEleman = listView1.SelectedItems[0].Index;
}

listView1.SelectedItems[0].Remove();

listView1.Focus();
listView1.Items[secilenEleman].Selected = true;

}[/cc]

Hali hazırda örneği indirmek için alttaki bağlantıyı kullanabilirsiniz.

[wpdm_file id=9]

03 Nisan 2013

Dinamik kontrol oluşturma ve sürükle bırak

Dinamik oluşturulan kontrolü çalışma zamanında kontrol etmek de diyebiliriz. Masaüstü form uygulamalarımızda bazen kullanıcılarımızdan çalışma anında kontrol oluşturmasını isteye bilir, bu oluşturulan dinamik kontrolü sürükle bırak yöntemi ile istediği yere konumlandırmak isteye biliriz. Hata oluşturduğu bu kontrolün özelliklerini(text, name) kullandırabiliriz.

dinamik-kontrol-surukle-birak

Şekildeki gibi bir form ekranı hazırladıktan sonra olayı ele alalım.(Beyaz panel içindeki butonları oluşturmayın!) Burada yapılan işlem şu şekilde cereyan etmekte; sol taraftaki butonu panel içine sürükleyip bırakıyoruz. Bırakıldıktan sonra panel içine yeni bir buton oluşturuluyor. Çalışma anında oluşturulan bu butonu panel içinde istediğimiz yere konumlandırabilir, tıkladığımızda butonun özelliklerini alabiliriz. Mevzumuz bu dostlar…

Kod kısmına geçmeden önce şimdiden söyleyeyim, kod kısmı biraz karışık gözükebilir. Örneği metotları ile birlikte teker teker yazdığınızda mevzunun o kadar zor olmadığını anlayacaksınız. Butonun; MouseDown, MouseLeave, MouseMove özelliklerine gelerek butona sürükle bırak özelliği veriyoruz. Çalışma zamanında oluşturulacak buton için gerekli metotları ekliyoruz.

[wpdm_file id=8]

[cc lang='csharp' ]bool tasimaBasladi;
int x;
int y;
protected void dinamikMetod(object sender, EventArgs e)
{
Button dinamikButon = (sender as Button);
MessageBox.Show(“Tıkdığın buton adı ” + dinamikButon.Text);

}
protected void dinamikBasla(object sender, MouseEventArgs e)
{
tasimaBasladi = true;
}
protected void dinamikDur(object sender, EventArgs e)
{
tasimaBasladi = false;
}
protected void dinamikTasi(object sender, MouseEventArgs e)
{
Button dinamikButon = (sender as Button);
if (tasimaBasladi == true && e.Button == MouseButtons.Left)
{
dinamikButon.Left += e.X – dinamikButon.Width / 2;
dinamikButon.Top += e.Y – dinamikButon.Height / 2;
}

lblx.Text = Convert.ToString(dinamikButon.Location.X);
lbly.Text = Convert.ToString(dinamikButon.Location.Y);
}

private void btnTasinan_MouseDown(object sender, MouseEventArgs e)
{
tasimaBasladi = true;
}

private void btnTasinan_MouseLeave(object sender, EventArgs e)
{
tasimaBasladi = false;
int i = 0;
foreach (Control ktn in panel1.Controls)
{
if (ktn is Button)
{
i = i + 1;
}
}

Button btn = new Button();
btn.Name = i.ToString();

btn.AutoSize = false;

btn.Size = new Size(80, 30);
btn.Text = “Buton ” + i.ToString();
btn.Font = new Font(btn.Font.FontFamily.Name, 8);
btn.Location = new Point(x, y);
panel1.Controls.Add(btn);
btnTasinan.Location = new Point(x: 12, y: 125);
btn.Click += new EventHandler(dinamikMetod);

btn.MouseDown += new MouseEventHandler(dinamikBasla);

btn.MouseLeave += new EventHandler(dinamikDur);

btn.MouseMove += new MouseEventHandler(dinamikTasi);

}

private void btnTasinan_MouseMove(object sender, MouseEventArgs e)
{
if (tasimaBasladi == true && e.Button == MouseButtons.Left)
{
btnTasinan.Left += e.X – btnTasinan.Width / 2;
btnTasinan.Top += e.Y – btnTasinan.Height / 2;
}
lblx.Text = Convert.ToString(btnTasinan.Location.X);
lbly.Text = Convert.ToString(btnTasinan.Location.Y);

x = btnTasinan.Location.X;
y = btnTasinan.Location.Y;
}[/cc]

Powered by WordPress