Aspnet QueryString makale gösterme

Başlık biraz anlamsız oldu anlıyorum sizi… Basit bir konu ile merhaba. Dinamik web sitelerinde kullanılan veritabanı ile ilişkili içerik yayınlama siteleri, kısaca basit makale okuma sitelerindeki database den makalenin sayfada nasıl gösterileceğini görelim.

Basit ve genel konu olduğu için araştırdığım kadarıyla çoğu site değinmemiş olaya. Direk konuya girersek, önceden hazırlarnmış veritabanımız ve tablomuz olsun. İçinde sade bir şekilde (id, baslik, makale) kolonları olsun. Görsel kısımda da bir ana.master sayfamız default ve makaleoku sayfalarımız olsun.

Birkaç ufak css ile ana.master sayfamızı başlıkların bulunduğu menü 300px ve yazının gösterileceği 600px lik alan ile ikiye bölünsün. Ana.master sayfamızın menüsüne güncel konular başlığı altında Datalist ekleyerek attaki gibi kodlayalım;

1
2
3
4
5
6
7
8
9
<asp:DataList ID="DataList1" runat="server" DataKeyField="yid"
        Width="224px">
        <ItemTemplate>
         
          <asp:HyperLink ID="HyperLink1" runat="server" Text ='<%# Eval("baslik") %>' NavigateUrl ='<%# "~/oku.aspx?giden="+Eval("yid")%>'>HyperLink</asp:HyperLink>              
         
         </ItemTemplate>
         <AlternatingItemStyle BackColor="Gainsboro" />
     </asp:DataList>

F7 ile kod kısmına gelerek postback ile kontrol edip load kısmına metod yardımı ile veri tabanımızdaki son 5 makaleyi gösterelim;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 if (Page.IsPostBack)
            {
                return;
            }
            doldur();

 private void doldur()
        {        
            SqlConnection sql = new SqlConnection("server=.; database=coder; trusted_connection=true;");
            SqlCommand cmd = new SqlCommand("Select top 5 * from tblyazi ", sql);
            DataTable dt = new DataTable();
            SqlDataAdapter adp = new SqlDataAdapter(cmd);
            sql.Open();
            adp.Fill(dt);
            SqlDataReader oku = cmd.ExecuteReader();
            if (oku.Read())
            {
                DataList1.DataSource = dt;
                DataList1.DataBind();

            }
            sql.Close();
        }

ana.master menümüzdeki son 5 yazıyı gösterdikten sonra makaleyi okuma kısmına geçebiliriz. Basit bir şekilde olması için makaleoku sayfasına başlık için label ve makale için bir label ekleyin. F7 ile kod kısman geçip load kısmına alttaki kodları yerleştirdikten sonra işlemi bitirelim;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected void Page_Load(object sender, EventArgs e)
        {
          SqlConnection sql = new SqlConnection("server=.; database=coder; trusted_connection=true;");

           
            int icerik = int.Parse(Request.QueryString["giden"]);

           
            SqlDataAdapter adp = new SqlDataAdapter("select * from makaletablosu where id=" + icerik, sql);
            DataTable dt = new DataTable();
            adp.Fill(tablo);
            Label1.Text = dt.Rows[0]["baslik"].ToString();
            Label2.Text = dt.Rows[0]["yazi"].ToString();

}

İşlem bu kadar, dikkat edilmesi gereken nokta Querystring dediğimiz yapı üzerinde. Başlıkları gösterdiğimiz ana.master sayfasında görsel kısmında ~/oku.aspx?giden= giden string i yakalayıp makaleoku sayfasında kod kısmında int.Parse(Request.QueryString[“giden”]); diyerek urlden gelen stringi yakalayıp makale id’sine göre veritabanından veriyi çekip göstermektek.

Benzersiz veri kayıt eden masaüstü uygulaması

Stok takip, telefon defteri, ürün deposu gibi benzersiz veri kayıt eden masaüstü uygulaması geliştirelim. Günlük iş hayatında veya projelerimizde bol bol kullandığımız ürün depo kayıt işlemi yapan mini C# ile Mssql tabanlı uygulama yapalım.

İlk olarak ürün adı, miktarı ve fiyat bilgilerini tutan, form yardımı ile yeni ürün ekleyen basit sade görünüşlü resimdeki gibi ürün form ekranı oluşturalım. Bunun için 3 adet textbox, kararınca label, 1 adet buton ve listedeki ürünleri gösterebilmek için 1 adet listview.

Listview kontrolü için yapılması gerekenler; üzerine tıklayınca çıkan ok kısmından View kısmını Details olarak ayarlayın. Edit Columns…‘a tıklayarak 4 tane kolon oluşturun. Properties alanından tüm satırı seçmeye yarayan FullRowSelect özelliğini ve satır-surun çizgilerin gösterilmesi için GridLines özelliğini True yapın, böylece listview kontrolü göze gelir hale gelecek.

Bu program ile ürün adı, miktarı, fiyatı eklenir, ürün listede yani veritabanın da mevcut değilse yeni ürün olarak eklenir. Fakat ürünümüz daha önceden veritabanımıza eklenmiş ise miktarı ve fiyatı arttırılır. Formumuzu oluşturduktan sonra MsSql üzerinden yeni veritabanı oluşturup(veritabanı ismi: coder) ürünler tablosu içerisine UrunId (int, ve Primary Key olarak ayarlanacak), Urunadi (nvarchar50), Miktar (int), Fiyat (Money) olarak girip urunler isminde tabloyu kayıt edin. Bunları yapmak zor geliyorsa alttaki kodları yeni sorgu sayfası açıp(New Query) alttaki kodları çalıştırdığınızda istenilen veritabanı tablo bilgileri ile oluşacaktır.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE DATABASE [coder]
GO
/****** Object: Table [dbo].[urunler] Script Date: 06/25/2011 01:14:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[urunler](
[UrunId] [INT] IDENTITY(1,1) NOT NULL,
[UrunAdi] [nvarchar](50) NOT NULL,
[Miktar] [INT] NOT NULL,
[Fiyat] [money] NOT NULL,
CONSTRAINT [PK_urunler] PRIMARY KEY CLUSTERED
(
[UrunId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Veritabanımızı ve formumuzu oluşturduktan sonra benzersiz ürün kayıt eden Stored Procedure‘ü yazabiliriz. Saklı yordamımız şöyle;

1
2
3
4
5
6
7
8
9
10
11
12
CREATE proc sp_urunkayit (@urunadi nvarchar(50), @miktar INT, @fiyat money)
AS
BEGIN
IF EXISTS (SELECT UrunAdi FROM urunler WHERE UrunAdi=@urunadi)
BEGIN
UPDATE urunler SET Miktar+=@miktar, Fiyat+=@fiyat WHERE UrunAdi=@urunadi
END
ELSE
BEGIN
INSERT INTO urunler (UrunAdi,Miktar,Fiyat) VALUES (@urunadi,@miktar,@fiyat)
END
END

Burada yapılan olay; ürün kaydı girildiği zaman eğer veritabanımızda ürün varsa mevcut ürünün üzerine miktarı ve fiyatı ekle yani update ile güncelleştirme yapıldı. Eğer ürün daha önce eklenmemiş ise insert into deyimi ile tabloya yeni ürün eklendi. Bunu telefon rehberi programında da yapılabiliriz, şöyleki ; eğer aynı telefon numarası eklenirse ekleme yapılmasın kullanıcıya bu numaradan olduğunu veya aynı isim soyisim de kayıt olduğunu vurgulata biliriz.

Sql kısımı bu kadardı, gelelim tasarımını hazırladığımız forma işlevsellik kazandırmaya.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
SqlConnection sql = new SqlConnection("server=.; database=coder; trusted_connection=true;"); //bağlantıyı global tanıladık
private void btnekle_Click(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = sql;

cmd.CommandText = "sp_urunkayit"; // Oluşturduğumuz procedure ü burada çağırıyoruz.
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@urunadi", txturunadi.Text); // "" arasına yazan değişkenleri procedure ü oluştururken yazmıştık. Buradaki olay bu değişken üzerinden parametre taşımak

cmd.Parameters.AddWithValue("@miktar", txtmiktari.Text);
SqlParameter prm = new SqlParameter("@fiyat", SqlDbType.Money); // money tipinde olduğu için fiyat kısmını bu şekilde yapıyoruz
prm.Value = txtfiyati.Text;
cmd.Parameters.Add(prm);

sql.Open();
int etkilenen = cmd.ExecuteNonQuery();
sql.Close();

if (etkilenen > 0)
{
MessageBox.Show("Kayıt girildi");
listviewdoldur();

}
else
{
MessageBox.Show("Ürün Eklenmedi!!!");

}
}

private void Form1_Load(object sender, EventArgs e)
{

listviewdoldur(); //form açılır açılmaz listviewi dolduryoruz
}

private void listviewdoldur()
{
listView1.Items.Clear(); //listview metod içeriği
SqlCommand cmd = new SqlCommand("select UrunID, UrunAdi, Miktar, Fiyat FROM urunler", sql); //tabloyu ve gerekli kolonları çaığırıyoruz
sql.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
ListViewItem li = new ListViewItem(); // listview içini dolduruyoruz
li.Text = rdr[0].ToString();
li.SubItems.Add(rdr[1].ToString());
li.SubItems.Add(rdr[2].ToString());
li.SubItems.Add(rdr[3].ToString());
listView1.Items.Add(li);
}
sql.Close();
}

Gereken açıklamalar kod içinde mevcut. Burada yaptıklarım; ilk önce global olarak bağlantıyı tanımladım. Ardından listview kontrolünü veritabanından gelecek bilgiler doğrultusunda doldurdum. Bunu metod olarak form_load kısmına ekledim. Böylece sayfa açılır açılmaz veri tabanındaki ürünler listesi karışımıza çıkacak. Ardından ekle butonu sayesinde oluşturduğumuz procedure e textbox lardan girilen parametreleri ADO.Net nimetlerinden faydalanarak gönderdik. Burada dikkat edilmesi gereken procedure deki parametre değişkenlerini doğru ve tipine göre yazmak. Ve bundan sonra yapmanız gereken f5 tuşuna basıp pazardan aldığınız taze domatesi, biberi vs buzdolabına koymadan önce kayıtlarını girmek.

Burada yapılan olaylar biraz karışık gelebilir, tabi yeni başlayanlar için. Yapılanları kısa ve özet olarak geçersek; veritabanı ve tablomuzu oluşturup stored procedure ü oluşturduk. Bu procedure sayesinde daha basit ve daha hızlı şekilde ürün kaydını gerçekleştirdik. Ardından bu kayıtları girebilmek ve önizleyebilmek için form ekranı oluşturduk, Ado.net ile sql bağlantımızı kurup mercimeği fırına gönderdik….

Aöf vize final not hesaplayıcı

Anadolu Üniversitesi Açık Öğretim Fakülte öğrencisini daha çok ilgilendiren bir program ile merhaba. Hali hazırda Aöf Vize-Final not hesaplama programını buradan indirebilirsiniz.

Aöf vize-final not sistemi; 100 üzerinden alınan puanın, vizenin %30’u ile finalin %70′ nin toplamı 50 puanı geçmek koşulu ile dersden geçilebilmekte. Bundan dolayı uygulamamız vize notu olarak girilen değeri %30’unu alarak finalden alman gereken minimum not ve doğru cevaplanması gereken soru miktarını vermekte.

Kullanıcı tarafını atlattıktan sonra yazılımcı tarafından devam edelim. Bu mini not hesaplama uygulamasını C sharp ile yapabilmek için bir adet textbox, 3 adet buton, tasarımı biraz görselleştirmek için ise 2-3 adet timer. Form tasarımını resimdeki veya uygulamayı indirerek benzerini yaptıktan sonra kod kısmına geçebiliriz;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();
            dogru.Enabled = false;
            puan.Enabled = false;

        }
       
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                double vize;
                vize = Convert.ToDouble(textBox1.Text);
                double sonuc;
                double soru;
                if (vize <= 100)
                {
                   
                    sonuc = Math.Floor((50 - vize * 0.3) / 0.7);  // sonucu yuvarlamak için math.floor ve math celling fonksiyonunu kullandık
                    soru = Math.Ceiling(sonuc / 3.3);
                    label2.Text = sonuc.ToString();

                    label3.Text = soru.ToString();

                    dogru.Enabled = true;
                    puan.Enabled = true;
                }
                else
                {

                    MessageBox.Show("Hata!!! Lütfen Geçerli Bir Not Giriniz...");
                    textBox1.Clear();

                   
                    label2.Text = "--";
                    label3.Text = "--";
                    dogru.Enabled = false;
                    puan.Enabled = false;
                }
            }

            catch
            {
                MessageBox.Show("Hata!!!     \n\nLütfen Notunuzu Rakamsal Değer ile Girin\n\nÖrnek: " 65 " gibi... ");
                textBox1.Clear();
            }

           
        }

        private void button2_Click(object sender, EventArgs e)
        {

            timer2.Enabled = true;

            textBox1.Clear();
            label2.Text = "--";
            label3.Text = "--";
            dogru.Enabled = false;
            puan.Enabled = false;
        }

             

        private void button3_Click(object sender, EventArgs e)
        {
            Application.Exit();  //programdan çık
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Opacity += 0.10;
            this.Opacity = Opacity;
            if (Opacity > 1.0)
            {

                timer1.Enabled = false;

            }
        }
       
           
        private void timer2_Tick(object sender, EventArgs e)
        {
            if (timer2.Interval<101)
            {
                timer2.Interval+=20;


                int c = 0;
                Random r = new Random();
                Point l = this.Location;

                while (c < 50)
                {
                    int sag = r.Next(1, 5);
                    int sol = r.Next(1, 5);

                    this.Location = new Point(l.X + sag, l.Y + sol);

                    c++;
                }
                this.Location = l;
            }

   
                    else
                    {
                        timer2.Enabled = false;  // timer2 durdu
                        timer2.Interval = 10;
                    }




        }

Burada Math.Floor ve fonksiyonları ile alınan notu daha doğru yazdırabilmek için çıkan sonucu yuvarladık. Uygulama sonuç olarak button1_Click içerisinde yapılan kodlamalardan ibaret. Diğerleri opsiyonel olarak yapılmış görsel özellikleri.(formun yavaş yavaş açılması, form titremesi, temizleme vs.)

Csharp’da basit kontrollü alarm

Bir önceki yazıda(Bugünün tarihi ve saati gösterme) uygulamasını biraz daha ileri götürerek; kullanıcın girdiği tarih ve saati kontrol edip eşitlendiğine alarm tarzı mesaj çıkaran uygulama ile merhaba.

Forma, resimdeki gibi bileşenleri ekleyelim. Bunlar; bugünün tarihi ve saati göstermek için 2 adet label ve bir tane timer nesnesi. Kullanıcıdan zaman verileri almak için; bir adet datetimepicker, 3 adet textbox, 2 adet buton ve alarmı kurmak için timer(formda bununla birlikte iki adet timer nesnesi oluyor).

Kod kısmına geçmeden önce başlıkta kontrollü yazmanın sebebini açıklayayım. Kontrollü, yani kullanıcın olası mantık ve giriş hatlarına karşı düzenlenmiş olduğu için yazdım. Örneğin kullanıcı eski bir tarihi girmiş olabilir, eski tarih girdiğinden dolayı alarm hiçbir zaman çalışmaz. Bundan dolayı kontrolleri ile yazmak istedim. Kod kısmında deneyerek ne demek istediğimi anlayacağınız umuyorum.

1
2
3
4
5
 private void saattarih_Tick(object sender, EventArgs e)
        {
            ltarih.Text = DateTime.Now.ToShortDateString();
            lzaman.Text = DateTime.Now.ToLongTimeString();
        }

Bugünün tarihi ve saati gösterme uygulamasında kileri burada tekrar yaptık.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
            int saat = 0;
            int dakika = 0;
            int saniye = 0;
            private void btnayarla_Click(object sender, EventArgs e)
            {
                if (txtsaat.Text == "" | txtdakika.Text == "" | txtsaniye.Text == "") // Saat veya dakika veya saniye boş bırakılmayacak
                {
                    MessageBox.Show("Girilen değerleri kontrol et \n Alanlardan herhangi birini boş bırakma");
                    return;
                }

                try //uygulamanın olsaı hatada kitlenmemesi için try catch ile girilen değerleri kontrol ettik
                {
                    saat = Convert.ToInt32(txtsaat.Text);
                    dakika = Convert.ToInt32(txtdakika.Text);
                    saniye = Convert.ToInt32(txtsaniye.Text);

                }

                catch
                {
                    MessageBox.Show("Girilen değerleri kontrol et \n Alanlardan herhangi birini boş bırakma");
                }

                if (23 < saat | -1 > saat) // saati 23 ile -1 arasına değerlerin girmesi şartı sağladık
                {
                    MessageBox.Show("Doğru saati girin!!!");
                    return;
                }
                else if (59 < dakika | -1 > dakika) // dakikayı saat gibi aynı şekilde şartı sağlattırdık
                {
                    MessageBox.Show("Doğru dakikayı girin!!!");
                    return;
                }
                else if (59 < saniye | -1 > saniye) // saniyeyi saat gibi aynı şekilde şartı sağlattırdık
                {
                    MessageBox.Show("Doğru saniyeyi girin!!!");
                    return;
                }

                alarmayar(dateTimePicker1.Value.Date);
            }

Burada saat, dakika ve saniye kontrollerini gerçekleştirdik. Kullanıcı hatalarına karşı uyarı mesajları sağladık. Try catch ile int değer almak için hata denetimi yaptırdık.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        DateTime alarmzamani; //değişken tanımladık
        private void alarmayar(DateTime zaman) //alarm ayarı için metot kullandık
        {

            alarmzamani = zaman;  //saat dakika ve saniyeyi alarmzamani zaman değişkenine atıyoruz
            alarmzamani = alarmzamani.AddHours(saat);
            alarmzamani = alarmzamani.AddMinutes(dakika);
            alarmzamani = alarmzamani.AddSeconds(saniye);

            if (DateTime.Now > alarmzamani) //alarmı eski zamana kurdurma!
            {
                MessageBox.Show("Geçmiş zamana alarm kuramazsınız !!!");
                return;
            }

            talarmkur.Enabled = true; //alarm timer'ını aktif hale geitriyoruz
        }

Burada metot kullanarak girilen saat, dakika, saniyeyi alarmzamani değişkenine atayarak eski tarih girilmemesi için kontrol sağladık.

1
2
3
4
5
6
7
8
9
10
11
12
        DateTime simdi;
        private void talarmkur_Tick(object sender, EventArgs e)
        {
            simdi = DateTime.Now;


            if (simdi.ToString() == alarmzamani.ToString())
            {
                talarmkur.Enabled = false;
                MessageBox.Show("Alarm Zamanı");
            }
        }

Son olarak da alarm için eklediğimiz timer nesnemi de simdi zaman değişkeni atayarak girilen değer ile karşılaştırma yaptık. Timer 1 saniyede bir çalışacağı için her saniyede bu döngüyü kontrol edecek girilen zamana geldiğinde ise messagebox ile “Alarm Zamanı” mesajını verecek(ses dosyası ekleyerek zil sesi çaldıra bilirsiniz).

Gerekli açıklamaları kod içinde bulabilirsiniz. Daha fazlasına ihtiyacınız olursa yorum yazmanız yeterli…

Csharp ile taksitli ödeme hesaplama

Taksitli alış veriş yapılan iş yerlerine uygun bir program ile merhaba. Uygulamada girilen tutarı aylık taksitler şeklinde listeleyen, taksitin ödeme zamanını da gösteren mini bir muhasebe programı.(Cumartesi ve Pazar günü hafta tatili olduğundan dolayı bu günlere denk gelen ödemeyi bir gün sonraya veya önceye atıyoruz)

Taksitli ödeme hesaplama programında kullanılacak materyaller; TextBox, ListView, ComboBox(Edit Items’dan uygun 2,3,4..12 şeklinde sayıları gir) ve iki adet buton.
Metot kullanarak yapılan bu uygulamada zaman fonsiyonları kullandık.

Hesapla butonuna çift tıklayarak kodlama geçebilirsiniz ;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
private void button1_Click(object sender, EventArgs e)
        {
            listView1.Items.Clear(); // ikinci kez hesapla butonuna tıklandığında yeni ödeme planı göster
            try  // try cath ile olası hatalar engellendi...
                  {
                               
                double para = Convert.ToDouble(textBox1.Text); //bölme işlemi olduğundan dolayı double kullanıldı
                double vade = Convert.ToDouble(comboBox1.SelectedItem);
                hesaplama(para, vade); // hesaplama metodu
            }
            catch
            {
                MessageBox.Show("Hata !!! Lütfen geçerli veri gir");
            }
        }

        private void hesaplama(double mpara, double mvade) // hesaplama metodu içeriği double kullanarak...
        {
            double odenecek = mpara / mvade; // tutar bölü seçilen taksit sayısı

            DateTime bugun = DateTime.Now; // şimdiki zamanı baz alarak bugun değişkeni tanımlandı
            DateTime odemegunu; // ödeme günü birincil olarak secildi

            for (int i = 0; i < mvade; i++)
            {
                odemegunu = bugun.AddMonths(i + 1); // taksitlendirme bir sonraki ay başlıyor... Ör: Ocak'da satın alınan ürün taksidi Şubat ayından itibaren başlamakta
                if (odemegunu.DayOfWeek.ToString() == "Saturday") // Ödeme günü Cumartesi 'ne denk gelirse bir önceki günü göster ödemeyi yaptır
                {
                    odemegunu = odemegunu.AddDays(-1);
                }
                else if (odemegunu.DayOfWeek.ToString() == "Sunday") // Ödeme günü Pazar'a denk gelirse bir sonraki günü göster ödemeyi yaptır
                {
                    odemegunu = odemegunu.AddDays(1);
                }

                ListViewItem list = new ListViewItem(); // listeleme olayı burada yapılmakta
                list.Text = odemegunu.ToLongDateString();
                list.SubItems.Add(odenecek.ToString("C"));
                listView1.Items.Add(list);
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            listView1.Items.Clear(); // temizle
        }

elimden geldiği kadar kodlar içinde açıklama yaptım. Bir sonraki uygulama ile görüşmek dileği ile…

Kaynak : Cemal Can AKGÜL (Bilge Adam Yazılım Eğitmeni)