Enum Değerlerini foreach Dönmek

Enum değerleri yazılım geliştiricilerin en sık kullandığı ve en faydalı yapılardan biridir. Bazı durumlarda enum yapısının içerdiği bütün değerleri dolaşmak gerekmektedir. Bu durumda kullanılan iki yöntem bulunmaktadır.

Enum.GetNames

Parametre olarak bir enum tipi alır. Sonuç olarak aldığı enum tipinin barındığı değerlerin adını içeren bir string dizisi döner.

Aşağıdaki örnek kodda hafta günlerini barındıran DayOfWeek enum yapısı foreach dönülmektedir.

string[] weekdays = Enum.GetNames(typeof(DayOfWeek));

            foreach (string weekday in weekdays)
            {
                Console.WriteLine(weekday);
            }

Enum.GetValues

Bu metot da GetNames metodu gibi bir enum tipi alır. Dönüş değeri olarak da içerisinde aldığı enum tipinin değerlerini barındıran bir dizi (Array) dönderir. Bu Array değerinin elemanları enum’un türüne dönüştürülerek kullanılabilir.

Aşağıdaki kodda örnek bir foreach bulunmaktadır.

            Array weekdays = Enum.GetValues(typeof(DayOfWeek));

            foreach (DayOfWeek weekday in weekdays)
            {
                Console.WriteLine(weekday);
            }

Not: typeof metodu parametre olarak adığı tür adının Type türünden tipini dönderir.




C# Extension Metotları Oluşturma




C# İle SQL Server İşlemleri

Yazılım geliştirme çoğunlukla veri saklama ve işleme amacıyla yapılır. Verilerin saklanması içinde bir veritabannı sistemi kullanılır. Videomuzda en çok kullanılan veritabanı sistemlerinden olan SQL Server’a C# ile işlem yapmayı öğreneceğiz.




Uygulamanın Tek Örneğinin Çalışmasına Müsaade Etmek

Bazı uygulamalar çalışma prensipleri gereği aynı anda tek örneğinin çalışmasına müsaade eder. Uygulama açık iken başka bir örneği çalıştırılmak istendiğinde yukarıdaki gibi uyarı mesajı verip açılacak olan son örneği iptal eder.

Bu işlem için System.Diagnostics sınıfına ait Process sınıfından yararlanılır. Aşağıdaki kod örneğinde görüldüğü gibi öncelikle Process.GetCurrentProcess().ProcessName kod parçası ile başlatılan uygulamanın işlem adı alınıyor. Process.GetProcessesByName metodu ile de bu isme sahip işlemlerin listesi alınıyor. Eğer bu isimde birden fazla işlem var ise uyarı mesajı verilip return komutu ile işlem iptal edilir ve uygulama sonlandırılır.

            Process[] processesByName = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
            if (processesByName.Length > 1)
            {
                MessageBox.Show("Uygulama zaten çalışıyor.");
                return;
            }

Kodu uygulamanızın Main metodunun içinde başlangıç formunu ekrana göstermeden önce kullanabilirsiniz. Bu şekilde kullanmanız durumunda Main metodunuz aşağıdaki gibi olacaktır.

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Process[] processesByName = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
            if (processesByName.Length > 1)
            {
                MessageBox.Show("Uygulama zaten çalışıyor.");
                return;
            }

            Application.Run(new Form1());
        }




C# String Değerden Diğer Veri Türlerine Çeviri

C# dilinin klavyeden girilen varsayılan veri tipi string türüdür. Alınan verinin kullanım yerine göre özellikle sayı türüne çevrilmesi gerekmektedir. Bu işlem yapılırken temel olarak üç yöntemden biri kullanılabilir. Bu yöntemler aşağıdaki gibidir:

  • Convert sınıfının ilgili metotlarından birini kullanmak
  • Hedef sınıfın Parse adlı metodunu kullanmak
  • Hedef sınıfın TryParse adlı metodunu kullanmak

Convert sınıfının ilgili metotları “To” ile başlayan ve hedef türün adı ile biten metotlardır. ToInt16, ToInt32, ToDouble vb…

İlk örneğimizi Convert sınıfı ile verelim:

string metin = textBoxNumber.Text;
if (metin.Any(c => !Char.IsDigit(c)))
{
    MessageBox.Show("Hatalı giriş");
    return;
}
int sayi = Convert.ToInt32(metin);

Bu örneğimizde if şartının içinde yer alan şartta girilen metnin sadece rakamlardan oluşup oluşmadığı test ediliyor. Rakam dışında bir karakter barındıran bir metin geldi ise “Hatalı giriş” uyarısını verip işlem return oluyor.

Aynı işlemi Parse metodu ile yapacak olursak kodu aşağıdaki gibi değiştirmemiz gerekmektedir.

            string metin = textBoxNumber.Text;

            if (metin.Any(c => !Char.IsDigit(c)))
            {
                MessageBox.Show("Hatalı giriş");
                return;
            }

            int sayi = Int32.Parse(metin);

Parse metodunun kullanımı da Convert sınıfının ToXXX metotlarının kullanımı ile aynıdır.

string to int çeviri işleminde kullanılan bir diğer metot da TryParse metodudur. Bu metodun kullanımı sırasında gelen metnin sadece rakamlardan oluşup oluşmadığını test etmeye gerek yoktur. Çalışma şeklini örnek kod üzerinden inceleyelim:

            string metin = textBoxNumber.Text;
            int sayi;

            bool tryParse = Int32.TryParse(metin, out sayi);
            if (tryParse)
            {
                MessageBox.Show("Doğru format");
            }
            else
            {
                MessageBox.Show("Yanlış format");
            }

TryParse metodunun geri dönüş tipi diğerlerinin aksine bool veri tipidir. Çalışma şekli de aşağıdaki adımlardan oluşmaktadır.

  1. Hedef veri türünde bir tanımla yapılır. (Satır 2)
  2. İlgili türün TryParse metodu çağrılır. İlk parametreye dönüştürülecek kaynak metin, ikinci parametreye de daha önce oluşturulan hedef türün örneği out parametresi ile verilir. (Satır 4)
  3. Bu metot çağırma sonucunda dönüşüm işlemi başarılı olursa hedef türün örneğine dönüşüm sonucu atanır, metot dönüş değeri de true olur. Dönüşümün başarısız olması durumunda ise hedef türün örneğine ilgili sınıfın varsayılan değeri atanır, metot dönüş değeri de false olur. Böylelikle işlemin sonucu bir if yardımı ile sorgulanmış olur.




Server Management Objects (SMO) İle SQL Server Kontrolü

Server Management Objects, .Net framework kullanarak SQL Server‘ı bütün yönleri ile yönetebileceğiniz yazılımlar geliştirmenizi sağlayan bir kütüphanedir. Örneğin aşağıdaki kod parçası ile sunucu üzerinde kolayca bir veritabanı oluşturuyoruz.

SMO kütüphanesini kullanabilmek için öncelikle Nuget üzerinden Microsoft.SqlServer.SqlManagementObjects projemize referans olarak eklememiz gerekmektedir.

SqlConnection sqlConnection = new SqlConnection("Data Source=localhost;Integrated Security=True");
ServerConnection serverConnection = new ServerConnection(sqlConnection);
Server server = new Server(serverConnection);

Database database = new Database(server, "Smo");
database.Create();

Bu kod ile sınıcı üzerinde Smo adında bir veritabanı oluşur.

Şimdi de başka bir işlem olan tablo oluşturma işlemi yapalım.

SqlConnection sqlConnection = new SqlConnection("Data Source=localhost;Integrated Security=True");
ServerConnection serverConnection = new ServerConnection(sqlConnection);
Server server = new Server(serverConnection);

Database workDatabase = server.Databases["Smo"];

Table table = new Table(workDatabase, "People");

Column idColumn = new Column(table, "Id", DataType.Int);
idColumn.Identity = true;
table.Columns.Add(idColumn);

Column nameColumn = new Column(table, "Name", DataType.NVarChar(50));
nameColumn.Nullable = false;
table.Columns.Add(nameColumn);

table.Create();

Bu kod ile server nesnesi üzerinde Smo veritabanını seçtikten sonra bu veritabanını parametre olarak verdiğimiz Tablo tipinde bir table nesnesi oluşturuyoruz. Daha sonra bu table nasnesini parametre olarak verdiğimiz ilgili kolonları oluşturup table.Create() ile veritabanını oluşturuyoruz.

Server Management Objects ile diğer işlemleri aşağıdaki videoda inceleyebilirsiniz

SMO İncelemesi

SMO video kodları:

https://github.com/saitorhan/ServerManagementObjects




MDI Form ve Tabbed Page MDI Nasıl Yapılır?

MDI form kısa tanımı, iç içe form olarak yapılabilir. C# Windows Form çalışmalarında birden fazla ekranla çalışmalarda açılan ikinci, üçüncü vs. formların ana formdan bağımsız açılması yerine ana formun içinde açılmasını sağlayan yapıdır.

Formları içinde barındıracak olan ana form MDIParent, ana form içinde açılan formlara da MDIChild ismi verilir. Açılan her bir MDIChild, MDIParent formunun MDIChildren koleksiyonunda tutulur.

MDI form yapılırken yapılan işlemler şöyledir:

  • MDIParent olarak kullanılacak olan ana formun IsMdiContainer özelliği true olarak ayarlanır.
  • Ana form içinde açılacak olan child formun MdiParent özelliğine de this anahtar kelimesi ile ana forma bağlanır.
  • Child formu Show() metodu ile form açılır.

Projenin kodlarına aşağıdaki GitHub linkinden ulaşabilirsiniz:

https://github.com/saitorhan/StudyingMdiForms

Uygulama Videosu




Veri Tabanı Tablosundan Entity Class Oluşturma

Veri tabanı işlemlerinin gerçekleştirildiği yazılımlarda tabloların entity C# sınıfları gerekebilmektedir. Her ne kadar Visual Studio içerisinde barındırdığı araçlar ile bunu otomatik yapıyorsa da T-SQL kodları kullanılarak da ilgili sınıf SQL Server tarafında oluşturulup kopyala – yapıştır ile projeye eklenebilir.

Aşağıdaki T-SQL kodu içerisinde ilk satırdaki ‘TableName’ yerine tırnaklar içerisine sınıf karşılığı oluşturulacak tablo yazılıp çalıştırıldığında print komutu ile oluşturulan sınıf ekrana gelecektir.

declare @TableName sysname = 'TableName' 

declare @Result varchar(max) = 'public class ' + @TableName + ' 

{' 

select @Result = @Result + ' 

    public ' + ColumnType + NullableSign + ' ' + ColumnName + ' { get; set; } 

' 

from 

( 

    select  

        replace(col.name, ' ', '_') ColumnName, 

        column_id ColumnId, 

        case typ.name  

            when 'bigint' then 'long' 

            when 'binary' then 'byte[]' 

            when 'bit' then 'bool' 

            when 'char' then 'string' 

            when 'date' then 'DateTime' 

            when 'datetime' then 'DateTime' 

            when 'datetime2' then 'DateTime' 

            when 'datetimeoffset' then 'DateTimeOffset' 

            when 'decimal' then 'decimal' 

            when 'float' then 'float' 

            when 'image' then 'byte[]' 

            when 'int' then 'int' 

            when 'money' then 'decimal' 

            when 'nchar' then 'char' 

            when 'ntext' then 'string' 

            when 'numeric' then 'decimal' 

            when 'nvarchar' then 'string' 

            when 'real' then 'double' 

            when 'smalldatetime' then 'DateTime' 

            when 'smallint' then 'short' 

            when 'smallmoney' then 'decimal' 

            when 'text' then 'string' 

            when 'time' then 'TimeSpan' 

            when 'timestamp' then 'DateTime' 

            when 'tinyint' then 'byte' 

            when 'uniqueidentifier' then 'Guid' 

            when 'varbinary' then 'byte[]' 

            when 'varchar' then 'string' 

            else 'UNKNOWN_' + typ.name 

        end ColumnType, 

        case  

            when col.is_nullable = 1 and typ.name in ('bigint', 'bit', 'date', 'datetime', 'datetime2', 'datetimeoffset', 'decimal', 'float', 'int', 'money', 'numeric', 'real', 'smalldatetime', 'smallint', 'smallmoney', 'time', 'tinyint', 'uniqueidentifier')  

            then '?'  

            else ''  

        end NullableSign 

    from sys.columns col 

        join sys.types typ on 

            col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id 

    where object_id = object_id(@TableName) 

) t 

order by ColumnId 

set @Result = @Result  + ' 

}' 

print @Result 




Uzak Bilgisayar Yerel Gruplardan Kullanıcı Silme

Sistem yönetiminde istemci bilgisayarlardaki özellikle “Yöneticiler” grubunda yer alan kullanıcıların kontrol edilmesi son derece önemlidir. Bu kontrol sonucunda da gerekli durumlarda bu kullanıcıların silinmesi gerekiyor. Bu işlem için bir yazılım geliştirilmesi gerekiyorsa gerekli olan C# metotu aşağıdaki gibidir.

public bool RemoveUserFromAdminGroup(string computerNameVeyaIp, string silinecekKullanıcı) 

        { 
            try 

            { 

                var de = new DirectoryEntry("WinNT://" + computerName); 

                var objGroup = de.Children.Find("Administrators", "Group"); 
//Administrator: Kullanıcısı silinecek grup
//Group: Statik bir değerdir. Administrator öğesinin grup olduğunu belirtiyor.

                foreach (object member in (IEnumerable)objGroup.Invoke("Members")) 

                { 

                    using (var memberEntry = new DirectoryEntry(member)) 

                        if (memberEntry.Name == user) 

                            objGroup.Invoke("Remove", new[] { memberEntry.Path }); 

                } 

 

                objGroup.CommitChanges(); 

                objGroup.Dispose(); 

 

                return true; 

            } 

            catch (Exception ex) 

            { 

                MessageBox.Show(ex.ToString()); 

                return false; 

            } 

        }




Visual Studio’da Siteyi Aynı Anda Birden Fazla Tarayıcı ile Açmak

Yazılım geliştirmenin en önemli işlemi yazılımı yazmaktan sonra elbette ki onu denemektir 🙂 Geliştirilen yazılım masaüstü uygulaması ise ekran ve yerleşim konusunda çok sıkıntı olmasa da geliştirilen uygulama web sayfası ise tarayıcılar arasında farklılık olabilmektedir. Burada devreye, geliştiricinin uygulamayı birden fazla tarayıcı ile deneme işlemi girmektedir. Bu işlemi her defasında farklı bir tarayıcı açarak yapabileceği gibi Visual Studio ile gelen özelliklerden biri olan çoklu tarayıcı işlemi ile de yapabilir. Aşağıda bu işlem için Visual Studio’nun ayarlanması adım adım anlatılacaktır.

  1. Visual Studio ekranında projeyi başlatmak için kullanılan menüden “Browse With…” seçeneğine tıklayın

    Tarayıcı Seçme İşlemi

  1. Ekrana bilgisayarınıza yüklü tarayıcıların listesini barındıran tarayıcı seçme ekranı gelecektir.

Tarayıcı Seçme Ekranı

  1. Tarayıcı seçme ekranından beraber açmak istediğiniz bütün tarayıcıları seçip tarayıcıları başlatmak için “Browse” butonuna tıklayın. Bu işlem sonunda seçilen bütün tarayıcılar başlatılacaktır.

Tarayıcıları Seçme İşlemi