KMRT BSRN

"Hiç kimsenin ilgisine ihtiyaç duymadığın gün olgunlaşırsın. Hiç kimseden beklentiye girmediğin gün yara almazsın. Ve hiç kimseye bağımlı kalmazsan kazanırsın." OSHO


Yorum bırakın

Win – Using CheckedListbox DataSource Property

Windows form uygulamalarında CheckedListbox(CLB) kontrolünü kullandığınızda “DataSource” özelliğinin bulunmadığını göreceksiniz. Fakat benim gibi inatla CheckedListBox(CLB) kontrolüne bir data source nesnesi bağlamak isterseniz. Aşağıdaki yöntemi kullanabilirsiniz..

CLB kontrolü aslında ListControl nesnesinden türediği için ve ListControl nesnesinin DataSource özelliği olduğu için bu yapıdan(ListControl) yararlanacağız..

List _list = new List();
_list.Add(new Worker.MyListObject() { ID = 0, UserName = "Murat" });
_list.Add(new Worker.MyListObject() { ID = 1, UserName = "??kran" });
_list.Add(new Worker.MyListObject() { ID = 2, UserName = "Ba?eren" });

ListControl _listControl = (ListControl)this.checkedListBox1;
_listControl.DataSource = _list;

image

Bu işlem sonrasında “SelectedValue”, “SelectedItem” ve “items” özellikleri CLB kontrolüne bağlanan listedeki nesneleri temsil eder.

Worker.MyListObject _obj = (Worker.MyListObject)this.checkedListBox1.Items[0];
MessageBox.Show(_obj.ID.ToString() + " " + _obj.UserName);

image

İyi kodlamalar..


3 Yorum

C# – Quick Cut-Copy-Paste For Textboxes (Hızlı Kes-Kopyala-Yapıştır)

Her uygulama için olmazsa olmazlardan biri hatta üç’ü Kes-Kopyala-Yapıştır işlemleridir. Kullanıcılar gerek metin kutuları üzerinde gerekse uygulamadan dışarıya bir çok Kes-Kopyala-Yapıştır işlemi yaparlar. Tabii en azından ben yapıldığını düşünüyorum. Bir yazılım geliştirici olarak da en çok sıkılarak yaptığım işlerden biri bu işlemleri, yani her uygulamada olması gereken temel işlemlerin gerçekleştirilmesidir. Kes-Kopyala-Yapıştır işlemleri bunlardan biri. Aynı şekilde klavye kısayolları, tab-order işlemleri vs bunlarda benim biraz sıkılarak yaptığım işlemler..

İşte yine böyle düşündüğüm bir gün, aklıma bu işi otomatik olarak yapabilecek bir kod geliştirebilirsem bu sıkıntı süreci kolayca atlatabilirim diye düşündüm. Tabii öyle bir kod olmalı ki, oluşturduğum kullanıcı arayüzlerinde her bir metin kutusu(Textbox) için kod yazmamalıyım. Her uygulamada kullanabileceğim bir kodum olsun. Bu kodu  yaniilgili yere yapıştırayım ve arayüzdeki(Form ya da Kullanıcı kontrolü(UserControl)) tüm metin kutularını(Textbox) etkilesin. Tabii bu öyle bir şey olmalı ki görselliği de olmalı. Yani uygulamayı zenginleştirmelidir. Diye düşünerek kolları sıvadım. 🙂 Aklıma gelen ilk yapı Office 2007 ve Office 2010 ‘da bir metin seçildiğinde çıkan menü benzeri(tabii çok daha basiti :)) bir yapı oldu. Tabii benim aklıma ilk başta daha basiti Kes-Kopyala-Yapıştır işlemlerini yapan bir ScreenTip benzeri bir yapı oldu. Eğer bunu yapabilirsem daha sonrasında geliştirebilirm.

image 

Gerçekleştirmek istediğim yapı.

Bu akılda çakan şimşekler gibi aklıma gelen ilk yapı içinde 3 tane yan yana butonun bulunduğu bir kullanıcı kontrolü(UserControl) oldu. Bu 3 buton sırası ile Kes-Kopyala-Yapıştır işlemlerini yapacak olan butonlardı. Form üzerinde odaklanılmış(Focus olunmuş) metin kutusunun üstünde görünür hale gelecek ve kullanıcının istediği işlemi yerine getirecekti. Odaklanılmış metin kutusundan başka bir kontrol’e(herhangi bir kontrol) odaklanıldığında bu Kes-Kopyala-Yapıştır işlemini yapan kullanıcı kontrolü(UserControl), metin kutusun üzerinden kaybolacaktı.

Visual Studio 2010 üzerinde hemen bir Windows Application uygulaması açtım ve bir kullanıcı kontrolü(UserControl) oluşturdum. Tabi belirtmem gereken bir nokta var. Kontrolü geliştirirken elimde Telerik RadControls vardı. RadControl’lerini kullandım. Fakat elinizde yoksa standart kontrolleri de kullanabilirsiniz. RadControl’leri kullandığım için benim uygulama biraz daha görsellik açısından zengin gelebilir. Neden benimki buna benzemiyor demeyin. 🙂 Tabii bu arada Telerik firmasına ait RadControllerinin nasıl bişi olduğunu merak edenler için www.telerik.com adresinden kontrolleri inceleyebilirler.

Oluşturduğum hızlı Kes-Kopyala-Yapıştır yapacak olan kullanıcı kontrolü şu şekilde oldu. Sağ tarafta dizayn aşamasındaki görüntü sol tarafta ise kontrollerin hiyerarşisini görebilirsiniz.. 3 buton koyarak sol’dakinin Dock özelliğini “Left”, sağdakinin Dock özelliğini “Right” ve ortadakinin Dock özelliğini “Fill” olarak ayarlamanız. 3 butonun da DisplayStyle özelliğini “Image” olarak ayarlayın ve her birine birer resim ekleyerek ImageAligment özelliğini “MiddleCenter” olarak ayarlayınız. Ben bu ayarları tercih ettim tabii isteğe göre, daha fazla buton ya da butonların resim ile beraber yazı içermeside sağlanabilir.

Quick CutCopyPaste User Control

Hızlı Kes-Kopyala-Yapıştır kullanıcı kontrolü.

Tabii bu kullanıcı kontrolünü(UserControl) kullanacağımız bir Form oluşturdum. Bu form detaylarıda aşağıdadır.

image

Kullanıcı kontrolünün kullanılacağı Form.

Uygulamamız çalıştığında otomatik olarak metin kutularının üzerinde kullanıcı kontrolünün oluşturulmasını sağlayacağız.

image

Hızlı Kes-Kopyala-Yapıştır özelliğinin uygulanmış hali.

Burada birkaç zorluğu belirtmek istiyorum. Oluşturduğumuz kullanıcı kontrolü(UserControl) yukarıdaki form’daki metin kutularının sol üst köşelerinde belirmelidir. Fakat şöyle bir durum söz konusu, kullanıcı kontrolünün(UserControl) dizayn aşamasında sürükle-bırak yöntemi ile oluşmasını istemiyorum. Yani ben sadece metin kutuları ile ilgilenmek istiyorum. Geliştireceğim kod bu işi otomatik yapmalı. Burada karşımıza çıkan sorunlar şunlar;

1) En üstteki metin kutusunun konumu gibi bir durumda üstünde yeterli alan bulunmadığında, kullanıcı kontrolünün(UserControl) metin kutusunun altında belirmesini istiyorum. Bunu kullanıcı kontrolünün(UserControl) “Location” özelliğine uygulayacağım birkaç basit matematik işlemi ile yapabileceğime inanıyorum.

image 

1. maddedeki istenmeyen durum.

2) Kullanıcı kontrolleri uygulama çalışırken(Run-time) aşamasında oluşarak, ilgili metin kutularının üstüne ya da duruma göre altına(1.maddedeki sebepten dolayı) konumlanmalıdır. Bunuda “Location”, “Left”, “Top” özelliklerini kullanarak yapabiliriz. Fakat GroupBox, panel gibi kapsayıcı(Container) kontrollerinin içinde yer alan metin kutularının konum bilgileri(“Location”, ”Left”, ”Top”) kapsayıcı kontrolün başlangıç konumundan itibaren hesaplanmış olduğundan, bir kontrolün ekrandaki konumunu form ‘un sol köşesinden itibaren hesaplayıp veren bir metoda ihtiyacımız vardır. Bu metodu herhangi bir kontrol’de mevcuttur. İsmi, “PointToScreen” dir.

3) Bir durumda metin kutuları için oluşturulan otomatik kullanıcı kontrollerinin(UserControl) görüntülenmesi aşamasında diğer kontrollerin altında kalarak görüntülenememesidir. Bu durumum çözümüde “Form.Controls.SetChildIndex(control, 0);” şeklinde “ChildIndex” değerinin “0” olarak ayarlanmasıdır.

image

3. maddedeki istenmeyen durum.

 

ctrlCutCopyPaste.Designer.cs
namespace WindowsFormApplication1
{
    partial class ctrlCutCopyPaste
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.
        protected override void Dispose(bool disposing) {
            if (disposing && (components != null)) {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary>
        /// Required method for Designer support – do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent() {
            this.rpnlCutCopyPaste = new System.Windows.Forms.Panel();
            this.rcmdCopy = new System.Windows.Forms.Button();
            this.rcmdPaste = new System.Windows.Forms.Button();
            this.rcmdCut = new System.Windows.Forms.Button();
            this.rpnlCutCopyPaste.SuspendLayout();
            this.SuspendLayout();
            //
            // rpnlCutCopyPaste
            //
            this.rpnlCutCopyPaste.Controls.Add(this.rcmdCopy);
            this.rpnlCutCopyPaste.Controls.Add(this.rcmdPaste);
            this.rpnlCutCopyPaste.Controls.Add(this.rcmdCut);
            this.rpnlCutCopyPaste.Dock = System.Windows.Forms.DockStyle.Fill;
            this.rpnlCutCopyPaste.Location = new System.Drawing.Point(0, 0);
            this.rpnlCutCopyPaste.Name = "rpnlCutCopyPaste";
            this.rpnlCutCopyPaste.Size = new System.Drawing.Size(72, 20);
            this.rpnlCutCopyPaste.TabIndex = 0;
            //
            // rcmdCopy
            //
            this.rcmdCopy.Dock = System.Windows.Forms.DockStyle.Fill;
            this.rcmdCopy.Image = global::WindowsFormApplication1.Properties.Resources.editcopy_16;
            this.rcmdCopy.Location = new System.Drawing.Point(24, 0);
            this.rcmdCopy.Name = "rcmdCopy";
            this.rcmdCopy.Size = new System.Drawing.Size(24, 20);
            this.rcmdCopy.TabIndex = 2;
            this.rcmdCopy.Text = "Kopyala / Copy";
            //
            // rcmdPaste
            //
            this.rcmdPaste.Dock = System.Windows.Forms.DockStyle.Right;
            this.rcmdPaste.Image = global::WindowsFormApplication1.Properties.Resources.editpaste_16;
            this.rcmdPaste.Location = new System.Drawing.Point(48, 0);
            this.rcmdPaste.Name = "rcmdPaste";
            this.rcmdPaste.Size = new System.Drawing.Size(24, 20);
            this.rcmdPaste.TabIndex = 1;
            this.rcmdPaste.Text = "Yap??t?r / Paste";
            //
            // rcmdCut
            //
            this.rcmdCut.Dock = System.Windows.Forms.DockStyle.Left;
            this.rcmdCut.Image = global::WindowsFormApplication1.Properties.Resources.editcut_16;
            this.rcmdCut.Location = new System.Drawing.Point(0, 0);
            this.rcmdCut.Name = "rcmdCut";
            this.rcmdCut.Size = new System.Drawing.Size(24, 20);
            this.rcmdCut.TabIndex = 0;
            this.rcmdCut.Text = "Kes / Cut";
            //
            // ctrlCutCopyPaste
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Controls.Add(this.rpnlCutCopyPaste);
            this.Name = "ctrlCutCopyPaste";
            this.Size = new System.Drawing.Size(72, 20);
            this.rpnlCutCopyPaste.ResumeLayout(false);
            this.ResumeLayout(false);

        }

        #endregion

        public System.Windows.Forms.Panel rpnlCutCopyPaste;
        public System.Windows.Forms.Button rcmdCopy;
        public System.Windows.Forms.Button rcmdPaste;
        public System.Windows.Forms.Button rcmdCut;
    }
}

ctrlCutCopyPaste.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormApplication1
{
    public partial class ctrlCutCopyPaste : UserControl
    {

        #region Events

        public event EventHandler ButtonClicked;

        #endregion

        #region Properties

        public TextBox CurrentTextBox { get; set; }

        #endregion

        #region Constructors

        public ctrlCutCopyPaste(TextBox txtBox) {
            InitializeComponent();

            this.Visible = false;
            this.CurrentTextBox = txtBox;

            this.SetQuickCutCopyPasteControlLocation();

            txtBox.Click += new EventHandler(txtBoxItem_Click);
            txtBox.GotFocus += new EventHandler(txtBoxItem_GotFocus);
            txtBox.LostFocus += new EventHandler(txtBoxItem_LostFocus);

            this.rcmdCut.Click += new EventHandler(rcmdCut_Click);
            this.rcmdCopy.Click += new EventHandler(rcmdCopy_Click);
            this.rcmdPaste.Click += new EventHandler(rcmdPaste_Click);

            // Form boyutu de?i?tirildi?inde quick kontrol g?r?nmez yap?l?r.
            this.CurrentTextBox.FindForm().ResizeBegin += new EventHandler(ctrlCutCopyPaste_ResizeBegin);
        }

        #endregion

        #region Private Methods

        private void SetQuickCutCopyPasteControlLocation() {
            // Kontrol?n ait oldu?u form'u bulur.
            Form controlForm = this.CurrentTextBox.FindForm();

            controlForm.Controls.Add(this);

            // Textbox kontrol?n?n form ?zerindeki konumunu verir.
            Point locationOnForm = controlForm.PointToClient(
                this.CurrentTextBox.Parent.PointToScreen(this.CurrentTextBox.Location));

            // Kes-Kopyala-Yap??t?r kontrol?n?n konumu hesaplan?r.
            int x = locationOnForm.X;
            int y = (locationOnForm.Y – this.Height < 0) ? locationOnForm.Y + this.CurrentTextBox.Height : locationOnForm.Y – this.Height;
            this.Location = new Point(x, y);

            // T?m kontrolleri ?zerinde g?r?nmesi i?in kes-kopyala-yap??t?r kontrol?n?n
            // form ?zerinde ilk alt index olmas? sa?lan?r.
            controlForm.Controls.SetChildIndex(this, 0);
        }

        #endregion

        #region Event Handlers

        protected void RaiseButtonClickedEvent() {
            if (this.ButtonClicked != null)
                this.ButtonClicked(this, null);

            this.CurrentTextBox.FindForm().Focus();

            if (this.CurrentTextBox != null)
                this.CurrentTextBox.Focus();
        }
        protected void ctrlCutCopyPaste_ResizeBegin(object sender, EventArgs e) {
            this.Visible = false;
        }

        protected void rcmdCut_Click(object sender, EventArgs e) {
            if (this.CurrentTextBox != null)
                this.CurrentTextBox.Cut();

            this.RaiseButtonClickedEvent();
        }
        protected void rcmdCopy_Click(object sender, EventArgs e) {
            if (this.CurrentTextBox != null)
                this.CurrentTextBox.Copy();

            this.RaiseButtonClickedEvent();
        }
        protected void rcmdPaste_Click(object sender, EventArgs e) {
            if (this.CurrentTextBox != null)
                this.CurrentTextBox.Paste();

            this.RaiseButtonClickedEvent();
        }
        protected void txtBoxItem_Click(object sender, EventArgs e) {
            // Form boyutu de?i?tirilmi? olabilece?i i?in quick CutCopyPaste kontrol? konumu tekrar hesaplan?r.
            this.SetQuickCutCopyPasteControlLocation();

            this.Visible = true;
        }
        protected void txtBoxItem_GotFocus(object sender, EventArgs e) {
            // Form boyutu de?i?tirilmi? olabilece?i i?in quick CutCopyPaste kontrol? konumu tekrar hesaplan?r.
            this.SetQuickCutCopyPasteControlLocation();

            this.Visible = true;
        }
        protected void txtBoxItem_LostFocus(object sender, EventArgs e) {
            this.Visible = false;
        }

        #endregion

    }
}

 

Form1.Designer.cs
namespace WindowsFormApplication1
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.
        protected override void Dispose(bool disposing) {
            if (disposing && (components != null)) {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support – do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent() {
            this.radTextBox1 = new System.Windows.Forms.TextBox();
            this.radTextBox2 = new System.Windows.Forms.TextBox();
            this.radTextBox3 = new System.Windows.Forms.TextBox();
            this.listBox1 = new System.Windows.Forms.ListBox();
            this.panel1 = new System.Windows.Forms.Panel();
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.panel1.SuspendLayout();
            this.groupBox1.SuspendLayout();
            this.SuspendLayout();
            //
            // radTextBox1
            //
            this.radTextBox1.AcceptsReturn = true;
            this.radTextBox1.AcceptsTab = true;
            this.radTextBox1.Location = new System.Drawing.Point(38, 15);
            this.radTextBox1.Name = "radTextBox1";
            this.radTextBox1.ReadOnly = true;
            this.radTextBox1.Size = new System.Drawing.Size(100, 20);
            this.radTextBox1.TabIndex = 0;
            this.radTextBox1.Text = "radTextBox1";
            //
            // radTextBox2
            //
            this.radTextBox2.AcceptsReturn = true;
            this.radTextBox2.AcceptsTab = true;
            this.radTextBox2.Location = new System.Drawing.Point(264, 8);
            this.radTextBox2.Name = "radTextBox2";
            this.radTextBox2.Size = new System.Drawing.Size(140, 20);
            this.radTextBox2.TabIndex = 0;
            this.radTextBox2.Text = "radTextBox1";
            //
            // radTextBox3
            //
            this.radTextBox3.AcceptsReturn = true;
            this.radTextBox3.AcceptsTab = true;
            this.radTextBox3.Location = new System.Drawing.Point(167, 12);
            this.radTextBox3.Name = "radTextBox3";
            this.radTextBox3.Size = new System.Drawing.Size(100, 20);
            this.radTextBox3.TabIndex = 0;
            this.radTextBox3.Text = "radTextBox1";
            //
            // listBox1
            //
            this.listBox1.FormattingEnabled = true;
            this.listBox1.Location = new System.Drawing.Point(325, 6);
            this.listBox1.Name = "listBox1";
            this.listBox1.Size = new System.Drawing.Size(97, 290);
            this.listBox1.TabIndex = 1;
            //
            // panel1
            //
            this.panel1.Controls.Add(this.radTextBox2);
            this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
            this.panel1.Location = new System.Drawing.Point(0, 209);
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(443, 99);
            this.panel1.TabIndex = 3;
            //
            // groupBox1
            //
            this.groupBox1.Controls.Add(this.radTextBox1);
            this.groupBox1.Location = new System.Drawing.Point(67, 88);
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size(200, 100);
            this.groupBox1.TabIndex = 2;
            this.groupBox1.TabStop = false;
            this.groupBox1.Text = "groupBox1";
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(443, 308);
            this.Controls.Add(this.groupBox1);
            this.Controls.Add(this.panel1);
            this.Controls.Add(this.listBox1);
            this.Controls.Add(this.radTextBox3);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load_1);
            this.panel1.ResumeLayout(false);
            this.panel1.PerformLayout();
            this.groupBox1.ResumeLayout(false);
            this.groupBox1.PerformLayout();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.TextBox radTextBox1;
        private System.Windows.Forms.TextBox radTextBox2;
        private System.Windows.Forms.TextBox radTextBox3;
        private System.Windows.Forms.ListBox listBox1;
        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.GroupBox groupBox1;
    }
}

Form1.cs
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 WindowsFormApplication1
{
    public partial class Form1 : Form
    {
        public Form1() {
            InitializeComponent();
        }

        /// <summary>
        /// Container kontrol?n?n i?erdi?i kontrol listesini verir.
        /// </summary>
        /// <param name="container">Kapsay?c? kontrol.
        /// <param name="list">Kontrol listesi.
        private void AddSubControlsToList(Control container, List<control> list) {
            if (container.Controls != null)
                foreach (Control c in container.Controls) {
                    list.Add(c);
                    AddSubControlsToList(c, list);
                }
        }
        /// <summary>
        /// Container kontrol?n?n i?erdi?i belirtilen tipteki kontrol listesini verir.
        /// </summary>
        /// <param name="container">Kapsay?c? kontrol.
        /// <param name="list">Kontrol listesi.
        /// <param name="type">Elde edilmek istenilen kontrol listesi.
        private void AddSubControlsToList(Control container, List<control> list, Type type) {
            if (container.Controls != null)
                foreach (Control c in container.Controls) {
                    // E?er belirtilen tipte ise..
                    if (c.GetType() == type)
                        list.Add(c);

                    AddSubControlsToList(c, list);
                }
        }
        /// <summary>
        /// Kontrol listesindeki kontrollere Kes-Kopyala-Yap??t?r i?lemini ger?ekle?tirecek olan kontrol? ekler.
        /// </summary>
        /// <param name="controlList">Kontrol Listesi.
        private void SetCutCopyPasteControl(List<control> controlList) {
            foreach (Control ctrl in controlList) {
                TextBox txtBox = ctrl as TextBox;

                if (txtBox != null) {
                    ctrlCutCopyPaste cutCopyPasteControl = new ctrlCutCopyPaste(txtBox);
                }
            }
        }

        private void Form1_Load_1(object sender, EventArgs e) {
            // Kontrol listesini tutacak nesne olu?turulur.
            List<control> controlList = new List<control>();
            // RadTextBox tipindeki kontrollerin listesi elde edilir.
            this.AddSubControlsToList(this, controlList, typeof(TextBox));
            // Kes-Kopyala-Yap??t?r i?lemini ger?ekle?tirecek olan kontrol, kontrol listesindeki
            // kontrollere ba?lan?r.
            this.SetCutCopyPasteControl(controlList);
        }
    }
}

Kodun içinde önemli kısımları açıklama satırları ile açıkladım. Bu kullanıcı kontrolünü(UserControl) kullanarak ve Form1.cs içindeki kodu istediğiniz form’lara yapıştırmanız yeterlidir. Bu sayede form’a eklediğiniz her metin kutusu için kullanıcı kontrolümüz(UserControl) aktifleşecektir. Uygulamamızdan birkaç ekran görüntüsü alalım. 🙂

image 

Yukarıda yeterli alan olmadığında Quick Cut-Copy-Paste kontrolünün görünmesi.

image 

Groupbox kontrolünün altında kalmadan metin kutusu üstünde görüntülenmesi.

image 

3. maddedeki hata görüldüğü gibi artık olmuyor.


Yorum bırakın

VB,CS – ApplicationEvents.vb ve program.cs ile Uygulama Genel İşlemleri

Uygulamalarımda ihtiyaç duyduğum işlemlerin başında tek bir noktadan uygulama login işlemlerini ve hata kaydetme işlemlerini yönetebilmektir. Login işlemi belki buna pek uymadı. Çünkü zaten tek bir login bölümü olur ve kullanıcı buradan uygulamaya giriş yapar. Peki şöyle bir durumda ne yapacaksınız. solution(çözümünüzde) projelerini yer almaktadır. Fakat bu projelerimizden biri genelde “Test Projemiz” olur. Bu durumda genelde test projesinde login bölümünü koymayız. Hızlı bir şekilde, bir test kullanıcı adı ve şifresi ile girilmiş gibi bilgisayarı kandıracak kodu “Form_Load” olayına yazarız yada bunu bir Class yapar ve Form açılışında bu Class’ın işlemesini sağlarız. Tabii ki test işlemlerimiz bazen tek form üzerinde yapabiliriz ama genelde Test projesi fazlaca form içerir ve bu form’ların her birinde bir test işlemi yer alır. Dolayısı ile bu form’ların her birinde login işlemini yapan class’ın çalışmasını isteriz..

Bu gibi durumlar bana baya can sıkıcı gelir ve buna genel bir çözüm bulmak isteriz. İşte burada yardımıza “ApplicationEvents.vb” Class’ı koşar. Bu .vb dosyasının oluşması için aşağıdaki adımları izlemelisiniz..

Projenize sağ tıklayıp “Properties” seçiniz..

Projenize sağ tıklayı Properties seçin.

“Application” sekmesinde “View Application Events” butonuna bastığınızda projenizde “ApplicationEvents.vb” class’ı “Partial” olarak oluşacaktır. Otomatik olarak ekrana gelecektir.

Application Events.vb dosyasının oluşturulması.

Proje içinde Application Events.vb

Bu class açıldığında artık yazının başında anlattığımız sorunlara bir çözüm olacağını umuyoruz. 🙂 Aslında biliyoruz ama çaktırmıyoruz 😉 ApplicationEvents.vb dosyası açıkken kod ekranının “ClassName” ve “MethodName” kısımlarındaki açılır listeyi kullanarak istediğimiz olay da işlem yapabiliriz.

Örneğin test projesinde uygulama başlangıç form’u hangi form seçilirse seçilsin. Login işlemini “MyApplication_Startup” metodu içinde yapabiliriz. Bu metod uygulama başladığında tetiklenir.

image

image

Örnek olarak böyle kodlayabiliriz..

Namespace My
    ' The following events are available for MyApplication:       
    ' Startup: Raised when the application starts, before the startup form is created.    
    ' Shutdown: Raised after all application forms are closed.  This event is not raised if the application terminates abnormally.    
    ' UnhandledException: Raised if the application encounters an unhandled exception.    
    ' StartupNextInstance: Raised when launching a single-instance application and the application is already active.
    ' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.    
    Partial Friend Class MyApplication
        '' Uygulama ba?lang?c?nda..        
        Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
            '' Login i?lemleri..           
            UserInfo.UserName = "Murat"
            UserInfo.UserSurname = "Ba?eren"
        End Sub
    End Class
End Namespace

Uygulama içinde yönetilmeyen bir hata olduğunda bunu yönetmek içinde bu kısımdaki metodlardan yararlanabiliriz. Yönetilmeyen kod’dan kastımız bir “Try..Catch” yapısı ile kontrol edilmeyen kodlama kısımlarıdır. Onun içinde “MyApplication_UnhandledException” metodu işimizi görecektir.

'' Y?netilmeyen hatalarda..
Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
    MessageBox.Show("Hata olu?tu. Kaydedildi.", "Hata Olu?tu.", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
    My.Application.Log.WriteException(e.Exception)
    e.ExitApplication = False
End Sub

Uygulamadan çıkarken bir işlem yapılabileceği gibi diğer metotları da kullanabilirsiniz.

Tabii ki bu işlemlerin Visual Basic tarafıydı. C# ‘ta ApplicationEvents.cs class’ını aramaya kalktığınızda projenizin özellikleri ekranında VB ‘deki gibi bir class’ı oluşturan buton bulamayacaksınız.. Bunun sebebi; C# ‘da o Class’ın zaten oluşmuş olmasıdır. İsmi de “Program.cs” dir.

Yukarıdaki işlemlerin benzerleri C# da aşağıdaki gibi kodlanarak elde edilir.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace ApplicationEventsCS
{
    static class Program
    {

        [STAThread]
        static void Main() {
            // VB'deki MyApplication_Startup e?leni?i metot budur.            
            // Y?netilmeyen hatalar?n yakalanaca?? olay..            
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
            MessageBox.Show("Hata olu?tu. Kaydedildi.", "Hata Olu?tu.", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            Microsoft.VisualBasic.Logging.Log log = new Microsoft.VisualBasic.Logging.Log();
            log.WriteException(e.Exception);
        }
    }
}

“Microsoft.VisualBasic.Logging.Log” sınıfını kullanabilmek için “Microsoft.VisualBasic” referansını projenize eklemeyi unutmayınız..


3 Yorum

C# – DataGridViewCheckboxCell ‘de Checkbox Değer Değişimini Yakalamak

Bir DataGridView üzerinde oluşturduğunuz Checkbox içeren kolonda, Checkbox’ın değerinin değişimini yakalamak istiyorsanız.. DataGridView ‘in iki adet event’ine şu kodları yazmanız gerekebilir. Tabii farklı yollarda mevcuttur. Fakat ben genelde aşağıdaki yöntemi kullanıyorum..

DataGridView’ın;

CurrentCellDirtyStateChanged” olayında, datagridview ‘ın editing(düzenleme, değişiklik yapma) işlemini sonlandırıyorum.
CellContentClick” olayında ise artık elimde işaretlenmiş ya da iaşreti kaldırılmış bir checkbox mevcuttur. İşleyecek kodumuzu buraya dolduruyoruz.. 🙂

Aşağıdaki kod ile DataGridView üzerinde bir checkbox kolon değeri değiştiğinde, checkbox hücresi hariç diğer hücrelerin yazı renginin kırmızı olması ve üstü çizilmesi sağlanmaktadır..


private void dgvItems_CellContentClick(object sender, DataGridViewCellEventArgs e)

{

    if (this.dgvItems.CurrentCell == null) return;

 

    if (this.dgvItems.CurrentCell.GetType() == typeof(DataGridViewCheckBoxCell))

    {

        if (this.dgvItems.CurrentCell.GetType() == typeof(DataGridViewCheckBoxCell))

        {

            bool isSelected = bool.Parse(this.dgvItems.CurrentRow.Cells[0].Value.ToString());

            DataGridViewCellStyle newStyle = new DataGridViewCellStyle();

            newStyle.ApplyStyle(this.dgvItems.RowTemplate.DefaultCellStyle);

 

            if (isSelected)

            {

                newStyle.ForeColor = Color.Red;

                newStyle.Font = new Font(this.dgvItems.RowTemplate.DefaultCellStyle.Font, FontStyle.Strikeout);

            }

 

            foreach (DataGridViewCell cell in this.dgvItems.CurrentRow.Cells)

            {

                if (cell.GetType() != typeof(DataGridViewCheckBoxCell))

                    cell.Style = newStyle;

            }

        }

    }

}

private void dgvItems_CurrentCellDirtyStateChanged(object sender, EventArgs e)

{

    this.dgvItems.EndEdit();

}



Yorum bırakın

VideoDers – Event Handling..

Bloğumu takip edenlere işte bomba gibi bir video dersi paylaşımı daha. Bu bunun gibi video dersleri ilerleyen günlerde, arayı fazla soğutmadan 😉 yayınlamaya devam edeceğim. Bu video dersimizde olay oluşturma, olayları kullanarak daha yönetilmesi ve izlenmesi kolay kod geliştirmeyi anlatıyorum. Sizin içinde çok faydalı olacağına inanıyorum.. Lütfen yorumlarınızı yazmayı unutmayın ! 🙂

http://content.screencast.com/users/MaviSeffaf/folders/Default/media/45dd8310-34c0-47c4-bede-b817a6843f7a/bootstrap.swf

Video Dersi indirmek için tıklayınız..

Proje dosyası :

http://cid-f2e617aff724ee2b.skydrive.live.com/embedicon.aspx/Video%20Derslerim/EventHandling/LessonEventHandlingSolution.rar


Yorum bırakın

C# – .NET Önemli Sınıf Tanımları ve Önemli Metod Ön Ekleri

Abstract(Soyut Sınıflar) : Kendi başına kullanımı anlamsız olan, genellikle türetilerek anlamlı halde kullanılması sağlanan, temel işlemleri içeren class yapısı.

Arabirim Sınıflar : Ara class yapıları. 
        Örneğin; Abstract Class TemelIslemler{soyut sınıf}  <–  Class VideoCapture{Arabirim sınıf}  <–  Class MsnRecorder , Class MyRecorder
ok yönünde inherit alınır. Arada bulunan class arabirim sınıfıdır.

Sealed Sınıflar(Somut Sınıflar) : İşlevlerinin  yeterli görüldüğü ve kendisinden bir türetme yapılamayacağı düşünülerek tasarlanmış sınıflardır. Bu sınıftan türetme işlemi yapılamaz.

Public Sınıflar : Erişim yetkisi sınırsız olan sınıflardır.


Virtual : Virtual(sanal) ön eki ile tanımlanmış metodlar override edilebilir anlamındadır.


Yorum bırakın

C# – C# ile Form Kenarlarına Çarpan Top Uygulaması(oyun)

Bu uygulamalarda dikkat etmeniz gereken birkaç nokta var. VB 6.0 da böyle bişi yazmıştım. MasaTenisi oyunu yazmıştım. Burada dikkkat edilecek bir kaç nokta şunlar; Öncelikle böyle bir oyun yazıyorsak en temel işlemleri ayrı ayrı form yaparak bir sindirmeli ve mutlaka kağıt kalem kullanmalıyız. Çünkü ilk başta anlama açısından basit denemeler iyi oluyor ve bir noktadan sonra harbiden kafa karışıyor, ben az tırlatmadım.

Kalem kağıt’tan başka dikkat edilecek neler olduğuna mesela ilk olarak şöyle ufak bir uygulama yazarak bakalım. Mesela bir topumuz olsun! Form’un kenarlarına gelince çarpsın ve diğer yöne gitsin. Yani ortada bir başka nesne olmasın sadece TOP ve Form..

Şu demin dediğim FORM ve TOP içeren Form’u anlatıyım..

Form ‘a bir tane PictureBox attım. İçinede çizdiğim bir Top resmini koydum.. Picturebox ‘ın “Name = PicBall” ve “SizeMode = AutoSize” yaptım.. Bir tane de Timer atalım Form’a …

Makaleyi yükle