Çözüldü Birden fazla butonu sorgulama

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

KöroğluK67

Zeptopat
Katılım
25 Temmuz 2023
Mesajlar
8
Daha fazla  
Cinsiyet
Erkek
Diyelim ki formuma 10 buton ekledim ve hepsinin rengini değiştirmek istiyorum ve butonların ismini de btn1, btn2, btn3.. Olarak belirledim. Bu butonları teker teker sorgulamak zorunda mıyım? Bunun daha kolay bir yolu yok mu? Atıyorum btn(degisken).BackColor = Color. Red; degisken++; gibi bir şey yapamaz mıyım?
 
Çözüm
Bir controldeki her bir öğeye foreach ile erişebilirsin, örnek kod veriyorum.
foreach (Control item in this.Controls) { if (item is Button btn) { btn.BackColor = Color. Red; } }
Kod:
butonRenk = Color.Red
buton1(degisken).BackColor = butonRenk;
buton2(degisken).BackColor = butonRenk;
buton3(degisken).BackColor = butonRenk;

bu şekil de yaparsan sadece renk değişkenini değiştirmen ve ui'yı set etmen yeterli olacaktır.
 
Son düzenleme:
ui'yi nasıl set edeceğim?
Sanırım c# da set etmene gerek yok evet gerek yokmuş, bahsettiğim şekilde yapabilirsin.
Renk kodlarını ayırıp farklı bir değişkende tutabilirsin, ya da her butonun farklı tasarımı varsa ayrı ayrı sorgu yapmak yerine hepsini bir fonksiyona yazıp tek seferde çağırabilirsin her yer de sorgu yapmana gerek yok.
 
Evet, static olarak tanımlanmış nesnelerin problemi bu. * Bir fonksiyon veya getter-setter yazıp tümünün değişmesini sağlarsın. Örneğin;

*: Control'ün bir liste olduğu aklıma gelmemişti. Şu mesajdaki yöntemde kullanılabilir.

Bir controldeki her bir öğeye foreach ile erişebilirsin, örnek kod veriyorum.
foreach (Control item in this.Controls) { if (item is Button btn) { btn.BackColor = Color. Red; } }


C#:
Color buttonBackColor { get { return button1.BackColor; } set {
    button1.BackColor = button2.BackColor = button3.BackColor = ... = value;
} }

//Bu şu şekilde kullanılabilir;
buttonBackColor = Color.Red;
//Tüm butonların backColor'ı kırmızı olacak.

/*    ALTERNATİF   */

void setButtonBackColor(Color color) {
    button1.BackColor = button2.BackColor = button3.BackColor = ... = color;
}

//Bu şu şekilde kullanılabilir;
setbuttonBackColor(Color.Red);
//Tüm butonların backColor'ı kırmızı olacak.
Yada buttonları dinamik olarak oluşturur ve forma eklersin. Bunun için pozisyonlarını ve boyutlarını falan elle girmen gerekecek. Alta alta veya yan yana oluşacak butonlar için ideal, onun dışında farklı konumlardaki butonlar için ideal değil ne yazık ki.

Örneğin;
C#:
List<Button> btnList = new List<Button>(); //Global olarak tanımlanmalı

//Load'da çalıştırılacak şekilde kullanılmalı aşağıdakiler.
void createButtons() {
    int x = 0; y = 0, w = 30, h = 15;
    for(int i = 0; i < 10; i++) {
        Button btn = new Button();
        btn.Text = $"Button {i}";
        btn.Location = new Point(x, y + 20);
        btn.Size = new Size(w, h);
        btnList.Add(btn);
        Controls.Add(btn);
    }
}
 
Son düzenleme:
Evet, static olarak tanımlanmış nesnelerin problemi bu. Bir fonksiyon yazıp tümünün değişmesini sağlarsın. Örneğin;
C#:
Color buttonBackColor { get { return button1.BackColor; } set {
    button1.BackColor = button2.BackColor = button3.BackColor = ... = value;
} }

//Bu şu şekilde kullanılabilir;
buttonBackColor = Color.Red;
//Tüm butonların backColor'ı kırmızı olacak.

/*    ALTERNATİF   */

void setButtonBackColor(Color color) {
    button1.BackColor = button2.BackColor = button3.BackColor = ... = color;
}

//Bu şu şekilde kullanılabilir;
setbuttonBackColor(Color.Red);
//Tüm butonların backColor'ı kırmızı olacak.
Yada buttonları dinamik olarak oluşturur ve forma eklersin. Bunun için pozisyonlarını ve boyutlarını falan elle girmen gerekecek. Alta alta veya yan yana oluşacak butonlar için ideal, onun dışında farklı konumlardaki butonlar için ideal değil ne yazık ki.

Örneğin;
C#:
List<Button> btnList = new List<Button>(); //Global olarak tanımlanmalı

//Load'da çalıştırılacak şekilde kullanılmalı aşağıdakiler.
void createButtons() {
    int x = 0; y = 0, w = 30, h = 15;
    for(int i = 0; i < 10; i++) {
        Button btn = new Button();
        btn.Text = $"Button {i}";
        btn.Location = new Point(x, y + 20);
        btn.Size = new Size(w, h);
        btnList.Add(btn);
        Controls.Add(btn);
    }
}

Ya da buton özelliklerini fonksiyona verebilirsin, yapısı sabit kalır ama istediğin özelliği de fonksiyona verip değişkenlere aktarabilirsin

C#:
void createButtons(btnText, btnSize, btnLocalion) {
    int x = 0; y = 0, w = 30, h = 15;
    for(int i = 0; i < 10; i++) {
        Button btn = new Button();
        btn.Text = btnText;
        btn.Location = btnLocation;
        btn.Size = btnSize;
        btnList.Add(btn);
        Controls.Add(btn);
    }
}

şeklinde yaparak modüler bir fonksiyon elde edersin.
 
Ya da buton özelliklerini fonksiyona verebilirsin, yapısı sabit kalır ama istediğin özelliği de fonksiyona verip değişkenlere aktarabilirsin

C#:
void createButtons(btnText, btnSize, btnLocalion) {
    int x = 0; y = 0, w = 30, h = 15;
    for(int i = 0; i < 10; i++) {
        Button btn = new Button();
        btn.Text = btnText;
        btn.Location = btnLocation;
        btn.Size = btnSize;
        btnList.Add(btn);
        Controls.Add(btn);
    }
}

şeklinde yaparak modüler bir fonksiyon elde edersin.
İlla modülerlik katılacaksa;
C#:
void createButtons(Size size, Point location, string text, int increaseX = 0, int increaseY = 0) {
    for(int i = 0; i < 10; i++) {
        Button btn = new Button();
        btn.Text = text;
        btn.Location = new Point(location.X + increaseX, location.Y + increaseY);
        btn.Size = size;
        btnList.Add(btn);
        Controls.Add(btn);
    }
}

//function overload
void createButtons(Size size, int x, int y, string text,  int increaseX = 0, int increaseY = 0) {
    createButtons(size, new Point(x, y), text, increaseX, increaseY); 
}

//function overload
void createButtons(int w, int y, int x, int y, string text,  int increaseX = 0, int increaseY = 0) {
    createButtons(new Size(w, y) , new Point(x, y), text, increaseX, increaseY); 
}
 
İlla modülerlik katılacaksa;
C#:
void createButtons(Size size, Point location, string text, int increaseX = 0, int increaseY = 0) {
    for(int i = 0; i < 10; i++) {
        Button btn = new Button();
        btn.Text = text;
        btn.Location = new Point(location.X + increaseX, location.Y + increaseY);
        btn.Size = size;
        btnList.Add(btn);
        Controls.Add(btn);
    }
}

//function overload
void createButtons(Size size, int x, int y, string text,  int increaseX = 0, int increaseY = 0) {
    for(int i = 0; i < 10; i++) {
        Button btn = new Button();
        btn.Text = text;
        btn.Location = new Point(x + increaseX, y + increaseY);
        btn.Size = size;
        btnList.Add(btn);
        Controls.Add(btn);
    }
}

//function overload
void createButtons(int w, int y, int x, int y, string text,  int increaseX = 0, int increaseY = 0) {
    for(int i = 0; i < 10; i++) {
        Button btn = new Button();
        btn.Text = text;
        btn.Location = new Point(x + increaseX, y + increaseY);
        btn.Size = new Size(w, y);
        btnList.Add(btn);
        Controls.Add(btn);
    }
}

Evet böyle daha iyi C# alanım değil mantıken anlatmak istedim, ayrıca "yapısı sabit kalır" dediğin için modüler yapmasını istedim
 
Benim amacım butonlarla otel odası yapmaktı yani forma 60 buton ekledim sırasıyla 1. oda, 2. oda. Diye dolu odalar kırmızı boş odalar yeşil olacaktı mecbur hepsini teker teker kontrol etmiştim zaten kod uzunluğuda bir anda 80'den 800'e çıkınca bunun başka yolu yok mu diye merak etmiştim anladım ki yokmuş.
Ekran Alıntısı.JPG
Ekran Alıntısı2.JPG
 
Benim amacım butonlarla otel odası yapmaktı yani forma 60 buton ekledim sırasıyla 1. oda, 2. oda. Diye dolu odalar kırmızı boş odalar yeşil olacaktı mecbur hepsini teker teker kontrol etmiştim zaten kod uzunluğuda bir anda 80'den 800'e çıkınca bunun başka yolu yok mu diye merak etmiştim anladım ki yokmuş.Eki Görüntüle 1878311Eki Görüntüle 1878312
Önce C# konusunda yeterli düzeye gelmeni öneririm bu kadar else if kullanmanın mantığı yok, yanlış anlama küçük görme gibi değil bu sana işkence olur, yapmaya çalıştığın projeyi de değersiz kılar, çok iyi bir kurstan eğitim alıp ileri seviye programlama tekniklerini öğrenmen işini daha çok kolaylaştırır.

Önce C# konusunda yeterli düzeye gelmeni öneririm bu kadar else if kullanmanın mantığı yok, yanlış anlama küçük görme gibi değil bu sana işkence olur, yapmaya çalıştığın projeyi de değersiz kılar, çok iyi bir kurstan eğitim alıp ileri seviye programlama tekniklerini öğrenmen işini daha çok kolaylaştırır.
Çünkü temel düzeyde olup ileri seviye programlama gerektiren bir projeye başlamak seni ilerletmez hatalarla yüzdürür ve çalışıyor diye iyi kod yazdığını sanmanı sağlar, önce eksiksiz bir C# temeli eğitimi alıp konuları atlamadan ilerlemeni tavsiye ederim, daha sonra ileri düzey bir eğitim alıp profesyonel programlama tekniklerini kavraman önemli. Bu şeyler başta zor gibi gelebilir ama işini kolaylaştırmak ve yazılım bilgini arttırmak için gerekli temel bir yol.
 

Geri
Yukarı