Listview içinde toplama işlemi

Listview’i çok severiz vesselam. Hele ki veri giriş-çıkış, gösterme işlemlerinde vazgeçilmezlerimiz arasındadır. Görüntüde listview sadece basit bir kontrol gibi gözükür. Ama birçok işimizi listview yardımı ile hallede bilmekteyiz. Bu kontrolü daha fazla sakız yapmadan başlıkta belirttiğim meseleye gelelim.

Mevzumuz şu; herhangi bir yerden listviewe girilen aynı isimdeki değerleri farklı satıra yazdırmadan mevcut satır üzerine yazdırmak. Örnekle açıklayacak olursak, stok takip programında listview üzerinden stoklarını tuttuğumuz ürünler için, aynı üründen eklediğimizde o ürünün sadece miktarını, adetini veya fiyatının üzerine ekleyerek yazdırmak. Bir nevi aynı isimdeki şeylerin rakamsal değerlerini toplayarak tek satırda birleştirmek.

Senaryo veya örnek aklınızda biraz canlandı ise ufak bir örnek ile pekiştirebiliriz. Resimde görüldüğü gibi 2 textbox bir buton ve birde baş rolümüz olan listview kontrolünü forma sürükleyin. Textbox’un biri eklenenin adı, diğerinde ise eklenenin miktarı girişi yapılmakta. Kendi kendinize ben hazırım diyorsanız butona çift tıklayıp kodlamaya geçe biliriz.

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
private void button1_Click(object sender, EventArgs e)
        {
            string adi = txtadi.Text;
            int miktar = int.Parse(txtmiktar.Text);


            bool varmi=false;

            foreach (ListViewItem item in listView1.Items)
            {
                if (item.Text == adi)
                {
                    varmi = true;
                }
            }

            if (varmi)
            {
                foreach (ListViewItem i in listView1.Items)
                {
                    if (i.Text == adi)
                    {
                        int icindeki = int.Parse(i.SubItems[1].Text);
                        icindeki += miktar;
                        i.SubItems[1].Text = Convert.ToString(icindeki);
                    }
                }
            }
            else
            {
                ListViewItem lv = new ListViewItem();
                lv.Text = adi.ToString();
                lv.SubItems.Add(miktar.ToString());
                listView1.Items.Add(lv);
            }

        }

Görüldüğü üzere ilk olarak textbox ları doğru bir şekilde değişkenlere atadık. Ardından programın kilit kodu olan bool tipli değişkeni false olarak tanımladık. Bunu yaptıktan sonra foreach ile girilmek istenenin adını listView1 kontrolünün içinde arattık. Eğer içinde varsa önceden false olarak tanımladığımız varmi değişkenine true değerini atadık.

Akabinde bu atanan true değeri ile if-else kullanarak tekrar listView1 içinde aynı isimdeki girdinin miktarı üzerine girilen miktarı topladık. Eğer daha önce aynı isimde girdi girilmemiş ise listView1’e yeni satır isim ve miktarı ile ekledik…

Form içinde alt form açmak

Bazen birden fazla form ile çalışmak isteye biliriz. Böyle durumlarda düz mantıkla projemizde çalışacağımız kadar form oluştururuz. Bunu birkaç form ile halledebiliriz. Ancak iş kullanıcının istediği doğrultusunda açılması gerek form olduğunda yapışıp kalabiliriz. Bunu önlemek için yardımımıza MDI formlar koşuyor.

MDI form mantığını Excel için örnek verebiliriz. Biliyorsunuz ki Excel içinde birden fazla excel dosyası açıp çalışabilmek deyiz. Adobe Photoshop programını da örnek göstere biliriz. İki ayrı resim ile çalışıldığında Photoshop içinde iki ayrı çalışma sayfası açılır onları istediğimiz yere Photoshop içinde hareket ettirebiliyoruz.

Örnekleri ve hikayeyi fazla uzatmadan MDI, form içinde form açma uygulamasına geçelim. Öncelikle bir tane ana form oluşturalım. Bunun için formun IsMdiContainer özelliğini True olarak ayarlayın.(Resimdeki gibi form arkaplan gri renkte olacak)

Form içinde alt form açmak için anaforma bir adet menü oluşturmamız gerekecek. Toolbox daki MenuStrip kontrolünü sürükleyip bırakarak oluşturabiliriz. Menü otomatik en üste çıkacak, özellikler bölümünden konumunu ayarlaya bilirsiniz. Üzerine tıklayarak menü isimlerini basit bir şekilde oluşturun.

Örneğe uygun olarak resimdeki gibi oluşturabilirsiniz. Ardından açılacak olan alt form için yeni windows form ekleyin. Formun IsMdiContainer özelliğini False olarak bırakıp, Name özelliğini altform olarak yazarsanız örneğimizdeki kodları daha iyi anlayabilirsiniz.

Çalışır vaziyetteki örneğimiz

Bunları yaptıktan sonra kod kısmına geçebiliriz. İlk önce yeni alt form oluşturmak için Yeni Form Aç menümüze çift tıklayıp Click olayına alttaki kodları yazalım.

1
2
3
4
5
6
7
8
9
10
11
12
int formsayim = 1;  // formsayim değişkenini global olarak tanımlayın !

 int formno= formsayim++;

            altform cocuk = new altform();

            cocuk.Name = "cocukform" + formno.ToString();
            cocuk.Text= "Yeni Alt Form " + formno.ToString();

            cocuk.MdiParent = this;

            cocuk.Show();

Açılan her yeni form için form numarasını 1 arttırarak yeni çocuk formun name özelliğine atadık. Sırası ile kapat menüsüne çift tıklayıp Clik olayına alttaki kodları yazalım

1
2
3
4
5
 if (this.ActiveMdiChild != null)
            {
                Form frm = ActiveMdiChild;
                frm.Close();
            }

Buradaki kod açılı form varsa en onu kapatır. Son olarak hepsini kapat menüsüne de çift tıklayıp Clik olayına alttaki kodları yazalım.

1
2
3
4
foreach (Form frm in this.MdiChildren)
            {
                frm.Close();
            }

foreach döngüsü ile form içindeki tüm çocuk formları kapatır.

Linq ile veritabanından listview e veri çekme

Linq to Sql ile veritabanımızdaki tabloyu sorgulayarak windows form mumuzdaki listview kontrolüne nasıl veri çekip göstereceğimizi bu örnek ile öğrenelim.

Öncelikle Linq to Sql den birz bahsedecek olursak; bu teknoloji, ORM aracını kullanarak bağlanılan veritabanındaki tabloları sınıf, kolonları da özellik(property) olacak şekilde üretir. Bu sayede oluşturulan sınıf içinde sql join işlemi yapmadan nesnelerle ilişkilendirme yaparak özelliklerine yani kolonlarına erişile bilmekte. Bunu söylemeden geçmek istemiyorum, nesneler hakkında temel bilgisi olmayan arkadaşlar linq e başlamadan önce nesneler(OOP) konusunda biraz bilgi sahibi bir kaç örnek yapmış olmaları gerekir.

Bu örneğimizde linq’e yeni başlayanların kafası karışmaması için basit bir okuma işlemi yaptık. Daha önce örneklerim de de kullandığım coder isimli veritabanımı(“tblkisi” tablo adında id, adi, soyadi olarak 3 kolondan oluşmakta) projemize tanıtmak için Solution Explorer penceresinden projemize sağ tıklayıp Add New Item deyip LINQ to SQL Classes .dbml dosyasını ekliyoruz. Burada dosya ismini dcoder ismi ile ekledim. Veritabanına yapılan bağlantı dosyasının adı(dcoderDataContext) ile işlemlerimize devam edeceğimiz için burası önemli. Kodlara bakarak neden isim verdiğimi öğrenebilirsiniz.

Soldaki server explorer yardımı ile veritabanımıza bağlantıyı gerçekleştiriyoruz. Ardından resimdeki gibi kullanacağımız tabloyu ortaya sürüklüyoruz. Kayıt edip form ekranımıza geçiyoruz.

Bundan sonra yapılacak iş form arayüzüne bir buton ve listview atıp butona clik olayına alttaki kodları yazmak;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void button1_Click(object sender, EventArgs e)
{
dcoderDataContext ctx = new dcoderDataContext();

var x = from kisiler in ctx.tblkisis where kisiler.id < 10 select kisiler;

foreach (tblkisi k in x)
{
ListViewItem li = new ListViewItem();
li.Text = k.id.ToString();
li.SubItems.Add(k.adi.ToString());
li.SubItems.Add(k.soyadi.ToString());
listView1.Items.Add(li);
}
}

[stextbox id=”info”]

Projemize eklediğimiz LINQ to SQL Classes dosyayı sizde dcoder olarak kayıt ettiyseniz kod kısmında Visual Studio intellisense hatırlatma özelliğinden otomatik dcoderDataContext isminde gelecektir. var x değişkenine, linq ile yaptığımız sorgu sonucunu(sorgumuz id’si 10 dan küçük olan kayıtları getirmek) atadık. Bu kayıtları göstermek için foreach ile döngüye girdik buradaki değerleri listview de gösterdik. [/stextbox]

Görüldüğü gibi 2 satır kod ile kolayca veriyi ekrana yansıttık. Bu sonucu Ado.net ile yapılan örnekle de alabilirsiniz. Fakat aradaki kod kolaylığı dişe değecek kadar büyük. Sql connection listview örneği bağlantısına tıklayarak Ado.net ile yapılmış haliyle karşılaştırabilirsiniz.

Listview tüm verileri database kayıt etme

Textbox dan veya başka bir yerden Listview’e girilen değerleri database imize kayıt etmek isteyebiliriz. Şöyle kısa bir senaryo ile anlatalım; kafe adisyon programında, garson masa müşteriden sipariş edilen ürünleri listview de saklayıp müşteri hesabını ödeyeceği zaman satılan ürünlerin adını ve fiyatını hesap kesiminde database’e kayıt ettirebilir. Buna benzer senaryoda kullanma babında bu uygulamayı paylaşmak istedim.

Örnek için resimdeki gibi bir arayüz formu hazırlayabilirsiniz. Buradaki amaç ilk önce textbox lardan girilen değerleri listview e kayıt etmek ardından listviewdeki tüm verileri tek hamle ile database e göndermek.

Burada coder isimli bir veritabanı bir tablo, içerinde id, adi ve soyadi kolonu bulunmakta. İlk önce textbox dan listview’e veri kayıt edelim.

1
2
3
4
5
6
7
8
private void button1_Click(object sender, EventArgs e)
{
ListViewItem lv = new ListViewItem();
lv.Text = textBox1.Text;
lv.SubItems.Add(textBox2.Text);
listView1.Items.Add(lv);

}

[stextbox id=”info”]Listview sınıfı nesneyi tanımladık fieldlarını doldurduk. Ardından listView1.Items.Add(lv) nesnedeki değeri listview e gönderdik. [/stextbox]

Resimdeki listview altında dbkayıt butonu ise listviewdeki değerleri tek seferde database e kayıt etmemizi sağlamakta. Buton clik ile kodlarına dalacak olursak;

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
private void button2_Click(object sender, EventArgs e)
        {

            int etkilenen = 0;

            for (int i = 0; i < listView1.Items.Count; i++ )
            {

                try
                {
                    SqlConnection sql = new SqlConnection("server=.; database=coder; trusted_connection=true;");
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = sql;

                    string adi = listView1.Items[i].SubItems[0].Text;
                    string soyadi = listView1.Items[i].SubItems[1].Text;
                   
                    cmd.CommandType = System.Data.CommandType.Text;
                    cmd.CommandText = "insert into tblkisi (adi,soyadi) values (@adi, @soyadi)";

                    cmd.Parameters.AddWithValue("@adi", adi);
                    cmd.Parameters.AddWithValue("@soyadi", soyadi);
                    sql.Open();
                    cmd.ExecuteNonQuery();

                    sql.Close();
                }
                catch (Exception)
                {
                    MessageBox.Show("Kayıt edilmedi");
                }
                                         
            }
            if (etkilenen != 0) // Açıklama 11 :
            {
                MessageBox.Show("Kayıt edilmedi !!!");
            }
            else
            {
                MessageBox.Show("Kayıt edildi...");
               
            }

        }

For döngüsü ile listview eklenmiş satır sayısı kadar döngü kurduk. Döngünün içinde değerleri okuması için listView1.Items[i] kaçıncı satırda ise o satırdaki veriyi stirng değişkenlerine atadık. Programın kopma noktası da burası oluyor zaten. Geriye kalan kısım Ado.net den başkası değil…

Programda bazı şeyler eksik biliyorum ama hatasız çalışmakta. Burada aktarmak istediğim bilgi listview içinde for ile dönmeden başka bir şey değil…

Demo süreli program yapma

Başlığı ilgi çeksin diye biraz karıştırdım. Özür dileyerek karşılığında size ilgi duyacağınız bilgiler paylaşmak istiyorum. Bir yazılımcı yazdığı programı kullanıcıya tanıtmak için demo veya kısıtlı süreli ücretsiz verir. Örneklerini her yerde görebiliriz(30 günlük antivirüs prog vs.). Kullanıcı memnun kaldığında parasını ödeyerek yazılımın serialini yani aktifleştirme kodunu satın alır. Sınırsızca veya belirli sürede kullanır vs vs.. Senaryoyu kafanızda canlandırmış sınızdır umarım. Fazla uzatmadan konuya dalmak istiyorum.

Basitçe bir form ekranına biraz afilli gözükmesi için resimdeki gibi 2 Label, 1 Progress Bar, 1 Buton ve son olarak aktifleştirme kodu girmek için 1 adet Textbox(janjanlı gözüksün diye maskedtextbox kullandım) yerleştirerek uygulamamıza başlayabiliriz. Senaryomuz şöyle ki;

Uygulama ilk çalıştığı an itibariyle 10 günlük olup, doğru aktifleştirme kodu girildiğinde süresiz çalışan yazılım.

Çalışma mantığı, çoğu süreli programın mantığına benzemekte. Hackerlar iyi bilir bu mantığı, nedenin soracak olursanız yapacağımız programda bu klasik yöntem ile gelişmekte. Ama o kadar da kolay kırılabilen programcık olamayacağını söyleyebilirim. Temelinde registry etkileşimi yatmakta.

Program ilk defa açılır açılmaz Registry’a bir anahtar ve alt anahtar oluşturup diğer günlerde açıldığında ilk atadığımız anahtarı baz alarak kalan süreyi kontrol edip belirtmek. Süre bittiğinde de öngörülen işlemi yapmak. Doğru aktifleştirme kodu girildiğinde ise ilk açıldığında kayıt edilen anahtarı silerek, bundan sonraki açılışlarında kontrol etmeden süresiz çalışmak.

Registry ilgili ilk örneğiniz ise bu(Csharp registry işlemleri) yazımı incelemenizde fayda olacak. Anladığınızı umarak direk kodlara dalıyorum;

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
using Microsoft.Win32; //Eklemeyi unutmayalım !!
       
RegistryKey anahtar = Registry.CurrentUser;
        private void Form1_Load_1(object sender, EventArgs e)
        {
           
            anahtar = anahtar.CreateSubKey("Software\\Coder");

            if ((anahtar.GetValue("Aktif") != null))
            {
                label1.Text = "Program aktif edilmiş";

                txtserial.Enabled = false;
                txtserial.Text = "4-8-15-16-23-42";

            }
            else
            {
                if (anahtar.GetValue("Sonkullanma") == null)
                {
                    label2.Text = "Yazılımı aktif edilmesi için 10 gün kaldı...";
                    anahtar.SetValue("Sonkullanma", DateTime.Now.AddDays(10), RegistryValueKind.String);
                    anahtar.Flush();
                }

                else
                {

                    DateTime dt1 = Convert.ToDateTime(anahtar.GetValue("Sonkullanma"));
                    DateTime dt2 = Convert.ToDateTime(DateTime.Now.AddDays(0));

                    TimeSpan fark = dt1 - dt2;

                    int sonuc = Convert.ToInt32(fark.Days);


                    if (sonuc <= 0)
                    {
                        MessageBox.Show("Süre Bitti");
                        progressBar1.Value = 100;

                    }
                    else
                    {

                        label2.Text = "Aktivasyon için " + Convert.ToString(sonuc) + " gün kaldı";

                        switch (sonuc)
                        {
                            case 1:
                                progressBar1.Value = 90;
                                break;

                            case 2:
                                progressBar1.Value = 80;
                                break;

                            case 3:
                                progressBar1.Value = 70;
                                break;

                            case 4:
                                progressBar1.Value = 60;
                                break;
                            case 5:
                                progressBar1.Value = 50;
                                break;
                            case 6:
                                progressBar1.Value = 40;
                                break;
                            case 7:
                                progressBar1.Value = 30;
                                break;
                            case 8:
                                progressBar1.Value = 20;
                                break;
                            case 9:
                                progressBar1.Value = 10;
                                break;
                        }
                    }
                }

            }

        }

        private void button4_Click(object sender, EventArgs e)
        {
           
            if (txtserial.Text == "4-8-15-16-23-42")
            {

                anahtar.SetValue("Aktif", 3, RegistryValueKind.String);
                anahtar.Flush();
                Application.Restart();

            }
            else
            {
                MessageBox.Show("Girilen anahtar yanlış");
            }

        }

Not : Kopyala yapıştır yapıldığında Form1_Load_1, button4_Click kısımlara göz ardı etmenizi isterim.

İşlemlerimizin çoğu formload kısmında gelişmekte. Sadece aktif etmek için buton kullanıldı. İlk olarak CurrentUser içindeki Software anahtarı içine Coder adında anahtar oluşturduk. “Aktif” isimli anahtarı koşullandırıp devam ettik (aktif anahtarı doğru aktivasyon kodu girdiğimizde oluşmakta tekrar değineceğim konuya). Ardından “Sonkullanma” isimli anahtarın var olup olmadığını kontrol edip yoksa 10 gün sonrası tarihe Registry’a kayıt ettik(programımız 10 günlük olduğu için). Eğer daha önceden eklenmiş ise Registry’dan değeri okuyarak bugününün tarihini çıkardık. 0 veya küçük ise gerekli işlemi yaptırdık.

Progressbar ile kalan gün sayısını Registry’dan okuyarak switch case sayesinde doldurduk. Bu arada doğru kodu girdiğimizde ilk açıklama da belirttiğim “Aktif” anahtarını Registry’daki anahtarımızın içine kayıt ettik. Programı tekrar çalıştırmak, tamamen aktifleştirmek için Application.Restart() metodunu kullandık.

Şifre Lost hayranları için tanıdık gelebilir. Konumuza geri dönersek, bu uygulama ile Registry’a veri kayıt edip okuma, iki tarih arası fark alma, istenilen bir sonraki tarihi gösterme, tarihin sadece gün kısmını alma, switch case ile progressbar doldurma gibi birçok örneği de beraberinde kullandık.

Genel olarak demo, kısıtlı bir program yazmak için yapmanız gereken işlemler bu şekilde. Güzel bir makyaj ile uygulamayı daha tatlı hale getirebilirsiniz. Bir sonraki yazıda görüşmek dileği ile…

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….

Ajax kontrolleri sorunsalları

Visual Studio ortamında da kullandığımız, geçmişte pek umursanmayan fakat yakın zamanlarda Google’ın arama çubuğunda ipucu uygulaması ile tekrar gündeme gelen ve ondan sonrada sık sık kullanılan Ajax teknolojisinin birkaç sorunsallarından bahsedeceğim.

Hikayeyi fazla uzatmadan herhangi bir Asp.net uygulamasında kullanacağımız meşhur hazır Ajax kontrollerinde bazen haftalarca süren sorunları ile baş başa kalan arkadaşlar için birkaç çözüm yolları. İlk olarak sorun adını belirtmek istersek; projeye eklediğimiz referans Ajax Toolkit Control .dll’nin çalışmaması.

Peki bu sonradan eklenilen Ajax kontrolleri neden çalışmaz?

  • .Net Framework 4 kütüphaneniz hasarlı olabilir. Microsoft .NET Framework 4 bağlantısına tıklayıp ilgili kütüphanenizi onarın.
  • Visual Studio’nun güncellemeleri varsa yapın, Service Pack yüklemediyseniz yükleyin.(Microsoft Visual Studio 2010 Service Pack 1)
  • Bu adımları sırasıyla veya hiç yapmayabilirsiniz belki sorun yoktur fakat soruna karşı bakış açınızı değiştirip uygulamanızı hangi kütüphane üzerinde yazdığınıza dikkat ederek Ajax Control Toolkit‘leri o Framework e göre ekleyin. Mesela Framework 3.5 ile yazıyorsanız uygulamanızı eklemeye çalıştığınız Ajax .Net4 kontrolleri haliyle çalışmayacaktır. Çalışmadığı zaman hem Debug da sorun verir hemde Toolbox kısmında kontroller soluk olarak gözükür(sürükle bırak yapamazsınız).

Sorunlar bu kadar bitmediğini biliyorum, fakat başıma gelen olayı nasıl çözdüğümü burada anlatmak istedim. Hikaye kısmı biraz uzun olabilir, bu stresli anınızda biraz gevşetmek için uzun uzaya anlatmak istedim…