Datagridview ve grafik chart ilişkisi

Datagridview içindeki verileri grafik üzerinden gösterebilmek için .Net 4.0 ile birlikte gelen toolbox da Data sekmesi içinde Chart kontrolü sayesinde yapabilirsiniz. Bu örnek uygulamada Datagridview kontrolündeki verileri göstermeye çalıştık. Listview gibi benzeri kontroller ile de verileri grafik olarak gösterebilirsiniz.

datagridview-grafik

Resimdeki örnek uygulama için forma bir datagridview ve chart kontrolü ekleyin. Chart kontrolü Series özelliğinden resimdeki gibi name adına sonuc olarak değiştirin.(Bunu neden yaptığımızı kod içinde anlayacaksınız.) Bunları yaptıktan sonra load olayına aşağıdaki kodları yazabiliriz;

chart-kontrolu-kullanimi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void Form1_Load(object sender, EventArgs e)
{
try
{
dataGridView1.Rows.Add("ali", 85);
dataGridView1.Rows.Add("veli", 60);
dataGridView1.Rows.Add("ayşe", 50);
dataGridView1.Rows.Add("ahmet", 75);
dataGridView1.Rows.Add("mehmet", 55);

for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
this.chart1.Series["sonuc"].Points.AddXY(dataGridView1.Rows[i].Cells[0].Value.ToString(), Convert.ToInt32(dataGridView1.Rows[i].Cells[1].Value.ToString()));
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
Like or Tweet this page to reveal the content.

Datagridview yazıcıdan yazdırmak

Datagridview kontrolü içindeki verilerle birlikte yazdırmak yani yazıcıdan çıktı almak çok kolay. Resimdeki gibi forma; Datagridview, buton, printDocument ekleyip kod kısmına geçebiliriz.

datagridview-yazdirma

1
2
3
4
5
6
7
8
9
10
11
12
 private void button1_Click(object sender, EventArgs e)
        {
            printDocument1.Print();
        }

        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            Bitmap bm = new Bitmap(this.dataGridView1.Width, this.dataGridView1.Height);

            dataGridView1.DrawToBitmap(bm, new Rectangle(0, 0, this.dataGridView1.Width, this.dataGridView1.Height));
            e.Graphics.DrawImage(bm, 0, 0);
        }

Form içinde kontrol boyutlandırma

Çalışma anında form boyutunu arttırdıkça kontrollerin yeri kayarak tasarımı bozulmaktadır. Bu gibi durumlar için form içinde ki kontrollerin özelliklerinde bulunan çapa özelliğini kullanarak çözebilirsiniz.

Örnek olarak resimdeki gibi forma bir kaç tane kontrol ekleyip aşağıdaki kodları uygulayın.

1
2
3
4
5
6
 private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
            button1.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right);
            groupBox1.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
        }

form-kontrol-boyutlandir

Visual Studio kod arka plan stilleri

Visual Studio kullanan her yazılımcının araması gereken eklentilerden bir tanesi de kod arka plan stilleri. Filmlerde, orada burada gördüğümüz kafayı bozmuş koder, hacker bilumum kod canavarlarının monitörlerini gösterdiklerinde kodların arka planı her zaman siyah veya koyu bir renk stili ile çalışmaktadır. Bunları farklı bir ide, nadir kişilerin kullandığı farklı programlar olarak görmeyin. Belki filmde gördüğünüz yazılımcının kullandığı ide Visual Studio‘nun ta kendisidir. Peki arka planı bu şekilde göstermelerinin ne önemi var ? Cevabı basit; açık renk beyaz, siyah veya kapalı bir renge göre gözleri daha fazla yorar bundan dolayı günün 4/3 ünü kodların başında geçiren insanların gözlerini yormamak için kod arka planı siyah veya koyu renkte olması bu yüzdendir.

kod-renklendirme

Visual Studio kod renklendirme için bulabileceğiniz renk şemalarına bu siteden ulaşabilirsiniz; http://studiostyl.es/

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.

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.
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
118
119
120
121
122
 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;
        }

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;

1
2
3
4
5
6
7
 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);
        }

Listviewden sıralı eleman silmek için;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 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;

        }

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

Listviewdeki veriyi excel e aktarma

Database veya herhangi bir veri kaynağından listview e aktardığınız verileri Listview den Excel’e veri aktarıp Excel dosyasında kayıt edebilirsiniz. Daha çok raporlama projelerinde Excel ile ilişkilendirerek kullanabileceğiniz bu uygulamayı nasıl yaparız basit bir örnek ile öğrenelim.

listview-excel-aktar

Resimdeki gibi boş bir forma listview kontrolü ve bir buton ekleyerek kod tarafına geçebiliriz. Buradaki örnekte listview i daha önceden bir şekilde doldurmuştum, konumuz aktarım olduğu için listview veri girilmesi gibi konulara girip de kod kısmını karıştırmamak istiyorum. Burada amacımız listviewdeki veriyi Excel dosyasına aktarmak.

csharp-excel-veri-aktarimi

Kod kısmına geçmeden projeye Microsoft Excel 15 Object Library referans olarak eklemeniz gerekir. Bunu Referance Manager içindeki COM kütüphanesi içinde bulabilirsiniz. Bu referansı eklemeden Excel dosyası oluşturma kodları hata verir. Ayrıca using Microsoft.Office.Interop.Excel; de kod tarafında using tarafında eklemeniz gerekir.

Gerekli ayarlamaları yaptıktan sonra kodlamaya artık geçebiliriz.

private void btnExcel_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
app.Visible = true;
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(1);
Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1];
//Kolon başlıkları sabit olduğu için listviewdeki veri aktarılmadan önce sabit verileri excel e giriyoruz.
object hucre;
Range rr;
string str;

hucre = ws.Cells[1, 1];
rr = ws.get_Range(hucre, hucre);
str = "İD";
rr.Value2 = str;
rr.Font.Bold = true;
rr.Font.Size = 12;

hucre = ws.Cells[1, 2];
rr = ws.get_Range(hucre, hucre);
str = "Adı";
rr.Value2 = str;
rr.Font.Bold = true;
rr.Font.Size = 12;

hucre = ws.Cells[1, 3];
rr = ws.get_Range(hucre, hucre);
str = "Soyadı";
rr.Value2 = str;
rr.Font.Bold = true;
rr.Font.Size = 12;
//toplam üç kolon girdik. Stilini değiştirdik.

int dikey = 2;
int yatay = 2;
foreach (ListViewItem lvi in listView1.Items)
{

dikey = 1;
foreach (ListViewItem.ListViewSubItem lvs in lvi.SubItems)
{
ws.Cells[yatay, dikey] = lvs.Text;
dikey++;
//Excel kolon genişliğini buradan aayarlıyoruz.
ws.Columns.ColumnWidth = 12;
}
yatay++;
}
}

Gerekli kod açıklamaları kod içinde mevcut. Fakat birkaç şey söylemeden yazımı sonlandırmak istemiyorum. Burada kod içinde Excel dosyasını oluşturduktan sonra ilk önce kolon başlıklarını girmemiz gerekiyor. Bunları girmezsek kolon başlıkları haliyle excel e aktarılmaz. Foreach döngülerini kullanarak Excel dosyamıza yazdırdık.

ws.Columns.ColumnWidth döngü içine eklememizin sebebi, normalde Excel’in standart kolon genişliğine göre yazdıracak kolon içindeki uzun veriler Excel içinde genişletmeden gözükmeyecektir. Yada ws.Columns.AutoFit(); ile kolon içindeki verinin genişliğine göre otomatik Excel kolonunu genişletebilirsiniz.

Yaptığımız örneğin kodlarını buradan indirebilirsiniz.