Selamlar herkese, uzun bir aradan sonra C# Basit Ajanda Uygulaması yazım ile yeni bir proje ile karşınızdayım. Çok fazla video isteği geldiği için bu projeyi hazırlarken videosunu çektim ve youtube’a yükledim. Ama maalesef videoda sesim yok. Kanalıma giderek 2 parttan oluşan videoları izleyebilirsiniz. Bu yazımızda (ne yapsam bulamadım) bir basit ajanda uygulaması hazırlayacağız. Ayrıca video çekmişken sizin için Github’da repository başlatmayı da gösterdim. Bu videodan izleyebilirsiniz.
C# Basit Ajanda Uygulaması
Videolu bir ders olduğundan dolayı projeyi çok fazla anlatmayacağım. Videoları eklemeden önce ne yaptığımızı anlatacağım.
İlk olarak MSSQL tabanlı proje olduğu için sql’de tablomuzu açtık. SQL’e bağlanmak için de C# SQL Connection Class Hazırlamak yazımda verdiğim kodlardan faydalandım.
Ana formda tarihte ileri geri gidebilecek ve direk farklı bir tarihe gitme işlemi yaptık. Buttonlara tıklayarak tarihler arasında gezindik ve tarihe girilen notları ekranda gösterdik.
Formun sağ kısmında bir flowlayoutpanel kullandık. Bu nesneyi kullanmamızdaki sebep, içerisine eklenen nesnelerin otomatik olarak sıralanmasıdır. Yani bir nesnenin formda nerede durması gerektiği ile uğraşmıyoruz. Burada notlarımızı göstermek için de UserControl kullandık. Not güncelleme işlemini de usercontol içerisindeki button ile yaptık. (Videoda görebilirsiniz.)
Bir adet not ekleme formumuz var ve buradan notlarımızı ekliyoruz.
Projenin yetenekleri bu kadardı. Projenin tüm kodlarına Github üzerinden de ulaşabilirsiniz.
Proje Kodları
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Basit_Ajanda { public partial class Anaform : Form { public Anaform() { InitializeComponent(); } private void Anaform_Load(object sender, EventArgs e) { lbl_Tarih.Text = DateTime.Now.ToString("dd.MM.yyyy"); // neden timer eklediğimi anlamadım :) // basit ajanda projesi tamamlanmış oldu.. :) Notlari_Getir(); } private void btn_ekle_Click(object sender, EventArgs e) { new Not_Ekle() { }.ShowDialog(); } void Notlari_Getir() { flowLayoutPanel1.Controls.Clear(); DataTable dt = Cls.SQLConnectionClass.Table("select not_RECno, not_Baslik, not_Icerik from NOTLAR" + " where not_Tarih >= '" + Convert.ToDateTime(lbl_Tarih.Text).ToString("yyyyMMdd") + "' + ' 00:00:00' " + " and not_Tarih <= '" + Convert.ToDateTime(lbl_Tarih.Text).ToString("yyyyMMdd") + "' + ' 23:59:59' "); // tarih ile saat arasında boşluk gerekli 03.04.2021 23.23 // bize burada ek olarak bir tarih daha lazım olacak. O da notun hangi tarihre gösterileceğini belirlemek için. Ekleyelim. for (int i = 0; i < dt.Rows.Count; i++) { NotGoster not = new NotGoster(); not.lbl_Baslik.Text = dt.Rows[i]["not_Baslik"].ToString(); not.rtxt_icerk.Text = dt.Rows[i]["not_Icerik"].ToString(); not.lbl_id.Text = dt.Rows[i]["not_RECno"].ToString(); flowLayoutPanel1.Controls.Add(not); } } private void btn_sonraki_Click(object sender, EventArgs e) { lbl_Tarih.Text = Convert.ToDateTime(lbl_Tarih.Text).AddDays(1).ToString("dd.MM.yyyy"); Notlari_Getir(); } private void btn_onceki_Click(object sender, EventArgs e) { lbl_Tarih.Text = Convert.ToDateTime(lbl_Tarih.Text).AddDays(-1).ToString("dd.MM.yyyy"); Notlari_Getir(); } private void btn_tarihe_git_Click(object sender, EventArgs e) { Tarihe_Git fr = new Tarihe_Git(); fr.ShowDialog(); if (fr.Devam == 1) { lbl_Tarih.Text = fr.Tarih.ToString("dd.MM.yyyy"); Notlari_Getir(); } } } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Basit_Ajanda { public partial class NotGoster : UserControl { public NotGoster() { InitializeComponent(); } private void btn_duzenle_Click(object sender, EventArgs e) { Not_Ekle fr = new Not_Ekle(); fr.txt_kayit_no.Text = lbl_id.Text; fr.ShowDialog(); // buradaki sıkıntımız güncellemeden sonra son halini ekrana yazmaması. Şimdi bir yöntemi deneyelim. lbl_Baslik.Text = fr.txt_baslik.Text; rtxt_icerk.Text = fr.txt_icerik.Text; // istediğimiz gibi oldu. O yüzden sıkıntı yok :) } } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Basit_Ajanda { public partial class Not_Ekle : Form { public Not_Ekle() { InitializeComponent(); } private void Not_Ekle_Load(object sender, EventArgs e) { not_oku(); } void not_oku() { if (Convert.ToInt32(txt_kayit_no.Text) > 0) { DataTable dt = Cls.SQLConnectionClass.Table("select not_RECno, not_Baslik, not_Icerik from NOTLAR where not_RECno = " + Convert.ToInt32(txt_kayit_no.Text) + " "); txt_baslik.Text = dt.Rows[0]["not_Baslik"].ToString(); txt_icerik.Text = dt.Rows[0]["not_Icerik"].ToString(); } else { } } private void btn_kaydet_Click(object sender, EventArgs e) { if (Convert.ToInt32(txt_kayit_no.Text) == 0) { Cls.SQLConnectionClass.Command("" + " INSERT INTO [dbo].[NOTLAR] " + " ([not_KayitTarih] " + " ,[not_Baslik] " + " ,[not_Tarih] " + " ,[not_Icerik]) " + " VALUES " + " ( getdate() " + " ,'" + txt_baslik.Text + "'" + " ,'" + Convert.ToDateTime(dateTimePicker1.Value).ToString("yyyyMMdd HH:mm") + "'" + " ,'" + txt_icerik.Text + "') " ); // bu insert komutu şu şekilde alınabiliyor. if (Cls.SQLConnectionClass.exception == null) { MessageBox.Show("Kayıt Başarılı"); Close(); } } else { Cls.SQLConnectionClass.Command("" + " update [dbo].[NOTLAR] set " + " not_DegistirmeTarih = getdate() " + " ,[not_Baslik] = '" + txt_baslik.Text + "' " + " ,[not_Icerik] = '" + txt_icerik.Text + "' " + " ,[not_Tarih] = '" + Convert.ToDateTime(dateTimePicker1.Value).ToString("yyyyMMdd HH:mm") + "' " + " where not_RECno = " + Convert.ToInt32(txt_kayit_no.Text) + " " ); // not_DegistirmeTarih sonradan ekşlediğim bir kolondur. if (Cls.SQLConnectionClass.exception == null) { MessageBox.Show("Güncelleme Başarılı"); Close(); } // bir keydetme denemesi yaptım. sql connection class çalışlıypor. :) } // Bu tarihi bu şekilde yapmamızın nedeni insert yöntemimizde parametre kullanmıyor oluşumuzdandır. // Bu yöntemle insert yapabilmek için sql'e yukarıdaki gibi göndermemiz gerekiyor. } private void btn_sil_Click(object sender, EventArgs e) { Cls.SQLConnectionClass.Command("delete from [dbo].[NOTLAR] where not_RECno = " + Convert.ToInt32(txt_kayit_no.Text) + " "); if (Cls.SQLConnectionClass.exception == null) { MessageBox.Show("Silme Başarılı"); Close(); } } private void btn_cikis_Click(object sender, EventArgs e) { Close(); // cancel button u çıkış butonu seçtiğimiz için ESC tuşuna bastığımızda form kapanacaktır. } } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Basit_Ajanda { public partial class Tarihe_Git : Form { public Tarihe_Git() { InitializeComponent(); } public DateTime Tarih = DateTime.Now; public int Devam = 0; private void btn_cikis_Click(object sender, EventArgs e) { Close(); } private void btn_tamam_Click(object sender, EventArgs e) { Devam = 1; Tarih = Convert.ToDateTime(dateTimePicker1.Value); Close(); } } }
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Windows.Forms; namespace Basit_Ajanda.Cls { public class SQLConnectionClass { private static string SQLConnectionString = @"Server = MUSTAFA\SQL2017; Database = BASIT_AJANDA_DB; Trusted_Connection = True;"; private static SqlConnection con = new SqlConnection(); private static SqlDataAdapter da = new SqlDataAdapter(); private static SqlCommand com = new SqlCommand(); public static SqlException exception = null; public static void Baglanti() { con = new SqlConnection(SQLConnectionString); if (con.State == System.Data.ConnectionState.Closed) { con.Open(); } } public static object Command(string query) { exception = null; // bir kere dolduktan sonra boşaltmadığımz için uyarı çıkmadı // kaydın başarılı olup olmadığıunı anlayacağüımız kontrol eklşeyelim. object obj = null; com.Connection = con; // SqlCommand com.CommandText = query; // SqlCommand try { obj = com.ExecuteScalar(); } catch (SqlException ex) { exception = ex; MessageBox.Show(ex.GetType().Name + " - " + ex.Message); // alşdığımız hata ' yani tek tırnak hatası. Yine parametre kullanılmadığı için. // bu hatanın önüne geçmek için tık tırnakları replace etmemiz lazım. yada farklı bir tek tırnak kullanmak gerekli. // mesela şunun gibi ’ ' farklı olduğunu görebiliyorsunz. } return obj; } public static DataTable Table(string query) { exception = null; // bir kere dolduktan sonra boşaltmadığımz için uyarı çıkmadı DataTable dt = new DataTable(); com.Connection = con; // SqlCommand com.CommandText = query; // SqlCommand da.SelectCommand = com; // // SqlCommand'ın bir select sorgusu olduğunu belirtiyoruz. try { da.Fill(dt); } catch (SqlException ex) { exception = ex; MessageBox.Show(ex.GetType().Name + " - " + ex.Message); } return dt; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace Basit_Ajanda { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Cls.SQLConnectionClass.Baglanti(); // burada f12 ye bastığımdan bandicam durmuş. geç fark ettim birazx ilerletmişsim. o kısımları göstereceğim. Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Anaform()); } } }
Projenin tüm kodları bu kadardı arkadaşlar. Şimdi videoları veriyorum.
İki part olmasının sebebi F12 tuşuna bastığım için bandicam’ın kaydı durdurması oldu. :)
C# Basit Ajanda Uygulaması yazımda bu kadar arkadaşlar. Diğer yazılarımda görüşmek üzere. Umarım faydalı olmuştur. Aşağıdaki linklerden eğitim seti sayfasına ve github projesine ulaşabilirsiniz.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz… Bu projenin Github sayfasına buradan ulaşabilirsiniz.
Sağlıcakla ve kodla kalın….