C#'ta Çok Sayıda Combobox ve textbox ile Çalışmak

Başlatan vitruvius, 24 Aralık 2011, 16:03:07

vitruvius

Merhabalar kendim için bir program yazıyorum. 56 adet combobox'ım ve textbox'ım var. Textboxla ilgili sorunum hepsinin toplamını almak istiyorum. Tabi ki tek tek yapınca oldukça uzuyor. Acaba bu işin kolay yolu nedir? Benim aklıma bir for döngüsü içinde textbox'ın numarasını değiştirmek geldi. Ama başaramadım.

Mantık olarak şu tarz bir şey düşündüm, tabi ki olmadı:

int sum = 0;
            int i;
            
            for (i=1; i<5; i++)
            {
            sum=sum+(Convert.ToDouble(label[i].text));
            }



Comboboxlarla ilgili olarak da: Her bir combobox'ın items kısmında 9 tane yazı var. A, B, C, D, E gibi. Ben bunların sayısal karşılıklarını kullanıyorum. A=1, B=2, C=3, D=4, E=5 gibi. Bunu if'lerle kontrol edip yapabiliyorum şu şekilde:

if (comboBox1.SelectedItem == "A")
                    i = 1;
                else if (comboBox1.SelectedItem == "B")
                    i = 2;
                else if (comboBox1.SelectedItem == "C")
                    i = 3;
                else if (comboBox1.SelectedItem == "D")
                    i = 4;
                else if (comboBox1.SelectedItem == "E")
                    i = 5;


Ama dediğim gibi 56 tane combobox ve hepsinin içinde 9 tane değer olduğu için bu mantıkla kodun sonu gelmiyor. Bütün combobox'lar için geçecek genel bir ifade nasıl yapabiliriz?

Teşekkürler.

RcALTIN

sanıyorum 50 tane comboBox kontrolünü de tek tek form üzerine koydunuz. bunu da gözeterek, size bu işlemleri nasıl daha pratik yapabileceğinizi gösterecek basit bir örnek hazırladım, kodlarını inceleyiniz.

http://hotfile.com/dl/138384379/659177c/multiControls.rar.html

"yerleştir" butonu istediğiniz sayıda combobox kontrolünün form üzerine yerleşmesini sağlıyor, ardından ortaya çıkan toplam butonu comboBox üzerinde yazılı olan değerleri topluyor ve combobox değerlerini de bu sırada güncelliyor.

eğer kendi projenizde bu elemanlar form değilde, panel, groupbox gibi container bir kontrol içindeyse ulaşma şekliniz this.Controls değil panel1.Controls, groupBox1.Controls diye olacak.
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

RcALTIN

senin amacına daha uygun hale getirmek gerekirse :

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

namespace multiControls
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            string[] elemanlar = { "A", "B", "C", "D", "E" };
            int sat = 6, sut = 5;
            Point p = new Point(0,0);
            for (int i = 0; i < sat; i++)
            {
                for (int j = 0; j < sut; j++)
                {
                    ComboBox c = new ComboBox();    //yeni bir combobox üretiyoruz
                    c.Items.AddRange(elemanlar);    //içine elemanlar dizimi olduğu gibi aktardım
                    c.DropDownStyle = ComboBoxStyle.DropDownList;   //sadece okunur liste
                    c.Location = p;                 //ekrandaki konumu
                    c.Width = 50;                   //genişliği
                    this.Controls.Add(c);           //form'a ekledim

                    p.X += 60;  //bir sonraki kontrol için pozisyonu biraz sağa alıyorum
                }
                p.Y += 30;      //bir sonraki kontrol için pozisyonu bir satır aşağıya alıyorum
                p.X = 0;        //satırın başından itibaren dizilsin diye
            }

            Button b = new Button();                //yeni bir buton
            b.Location = p;                         //combolardan arta kalan son pozisyona eklensin
            b.Text = "Topla";                       //görünen adı
            b.Click += new EventHandler(b_Click);   //bir click eventi ekledim ("b_click" metodu)
            this.Controls.Add(b);                   //form'a ekledim
            this.Controls.Remove(button1);          //yerleşim butonunu formdan kaldırdım
        }

        void b_Click(object sender, EventArgs e)
        {
            int toplam = 0;
            for (int i = 0; i < this.Controls.Count; i++)
            {
                if (this.Controls[i] is ComboBox)   //kontrol combobox mı?
                {
                    ComboBox c = (ComboBox)this.Controls[i];    //o zaman cast edelim
                    toplam += DegerCevir(c.Text);               //görünen değerini alıp toplama ekleyelim
                }
            }
            MessageBox.Show("Toplam: " + toplam);
        }

        //bu metodla string'e karşılık integer değer alıyoruz, A için 1 gibi..
        int DegerCevir(string deger) 
        {
            int d = 0;
            switch (deger)
            {
                case "A":
                    d = 1;
                    break;
                case "B":
                    d = 2;
                    break;
                case "C":
                    d = 3;
                    break;
                case "D":
                    d = 4;
                    break;
                case "E":
                    d = 5;
                    break;
            }
            return d;
        }
    }
}
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

cicjoe

int toplam = this.Controls.OfType<ComboBox>().Sum(c => c.SelectedIndex+1);

Seckin ALAN

#4
tüm textboxların içeriğini toplamak için
unutmadan küsüratlı sayılar için virgül kullanmak gerekir unutmadan :)
            float sayi,toplam;
            sayi = 0;
            toplam = 0;
            for (int i = 0; i < this.Controls.Count; i++)
            {
                if (this.Controls[i] is TextBox)
                {
                    TextBox c = (TextBox)this.Controls[i];
                    sayi = float.Parse(c.Text);
                    toplam = toplam + sayi;
                }
            }
            MessageBox.Show(Convert.ToString(toplam));


comboları sayiya donusturen fonksiyon
        int combolari_donustur(string gelen_veri)
        {

           gelen_veri = gelen_veri.Replace("A", "1");
           gelen_veri = gelen_veri.Replace("B", "2");
           gelen_veri = gelen_veri.Replace("C", "3");
           gelen_veri = gelen_veri.Replace("D", "4");
           return Convert.ToInt16(gelen_veri);
        }

değeri donusturmek icin
            int i = combolari_donustur(comboBox1.SelectedItem.ToString());
            MessageBox.Show(Convert.ToString(i));
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana

vitruvius

Hocam çok teşekkür ederim ilgileriniz için. RcALTIN hocam benim için ağır oldu kodlar =) Anlayamadığım şeyi kullanmak istemiyorum. Seçkin hocam sizin kodlarınız üzerinde çalıştım textbox kısmında sıkıntı yok. Bu combolar'ı dönüştüremedim ama.

Şu şekilde yazınca int y = combolari_donustur(comboBox1.SelectedItem.ToString());  satırının int kısmının altı yeşil şekilde çiziliyor. Unreachable code detected diyor. Programı çalıştırıp butona bastığımda message box dahi çıkmıyor. Bir de hocam burada return satırı ne işe yarıyor acaba onu da bilemedim  :-[

int combolari_donustur(string gelen_veri)
        {

            gelen_veri = gelen_veri.Replace("A", "1");
            gelen_veri = gelen_veri.Replace("B", "2");
            gelen_veri = gelen_veri.Replace("C", "3");
            gelen_veri = gelen_veri.Replace("D", "4");
            return Convert.ToInt16(gelen_veri);


            int y = combolari_donustur(comboBox1.SelectedItem.ToString());
            MessageBox.Show(Convert.ToString(y));

        }


Eğer son iki satırı ayrı  {  } arasına alırsam bu sefer combolari_donustur'den dolayı komple altı kırmızı çizili şekilde hata veriyor.

Seckin ALAN

Alıntı yapılan: vitruvius - 24 Aralık 2011, 19:10:11
Hocam çok teşekkür ederim ilgileriniz için. RcALTIN hocam benim için ağır oldu kodlar =) Anlayamadığım şeyi kullanmak istemiyorum. Seçkin hocam sizin kodlarınız üzerinde çalıştım textbox kısmında sıkıntı yok. Bu combolar'ı dönüştüremedim ama.

Şu şekilde yazınca int y = combolari_donustur(comboBox1.SelectedItem.ToString());  satırının int kısmının altı yeşil şekilde çiziliyor. Unreachable code detected diyor. Programı çalıştırıp butona bastığımda message box dahi çıkmıyor. Bir de hocam burada return satırı ne işe yarıyor acaba onu da bilemedim  :-[

int combolari_donustur(string gelen_veri)
        {

            gelen_veri = gelen_veri.Replace("A", "1");
            gelen_veri = gelen_veri.Replace("B", "2");
            gelen_veri = gelen_veri.Replace("C", "3");
            gelen_veri = gelen_veri.Replace("D", "4");
            return Convert.ToInt16(gelen_veri);


            int y = combolari_donustur(comboBox1.SelectedItem.ToString());
            MessageBox.Show(Convert.ToString(y));

        }


Eğer son iki satırı ayrı  {  } arasına alırsam bu sefer combolari_donustur'den dolayı komple altı kırmızı çizili şekilde hata veriyor.
fonskiyon içerisinde o fonksiyonu çağıramazsın :) biraz değişik bir cümle oldu :)
        int combolari_donustur(string gelen_veri)
        {

           gelen_veri = gelen_veri.Replace("A", "1");
           gelen_veri = gelen_veri.Replace("B", "2");
           gelen_veri = gelen_veri.Replace("C", "3");
           gelen_veri = gelen_veri.Replace("D", "4");
           return Convert.ToInt16(gelen_veri);
        }

bu senin fonksiyonun bunu buton içerisine değil ana iskelete yazacaksın
        int combolari_donustur(string gelen_veri)
        {

           gelen_veri = gelen_veri.Replace("A", "1");
           gelen_veri = gelen_veri.Replace("B", "2");
           gelen_veri = gelen_veri.Replace("C", "3");
           gelen_veri = gelen_veri.Replace("D", "4");
           return Convert.ToInt16(gelen_veri);
        }
        private void button2_Click(object sender, EventArgs e)
        {
            int i = combolari_donustur(comboBox1.SelectedItem.ToString());
            MessageBox.Show(Convert.ToString(i));
        }

buton 2 ye tıkladığımızda combobox1 in string değerini integera çeviriyor fonksiyon ile ve bunu i ye atıyor. Sen bu comboların değerini sayıya döndürüp ne yapmayı planlıyorsun?
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana

vitruvius

#7
Hocam sayıya döndürüp textbox'taki değerle çarptırıp sonucu bir yere yazacağım. Yani 1. combobox'taki değer ile 1. textbox'ı, 2. combobox'taki değer ile 2. textbox'ı... Şimdi textbox'ta yaptığımız mantığı uyarlayıp textbox'ın n. elemanı ile combobox'ın n. değerini çarptırmak kaldı =) Çok teşekkür ederim ilginiz için.

Seckin ALAN

o zaman sana söyle bir ip ucu vereyim :)
üç boyutlu diziler zor göründüyse tek boyutlu üç dizi :)
dizi 1 textboxları tutsun
dizi 2 comboları
dizi 3 te çarpımlarını :)
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana

vitruvius

Hocam peki textbox kısmında this.Control ifadesi nedir? Ezbere gitmeyelim  :)

Seckin ALAN

buradaki.Kontrol düz mantık :)
       for (int i = 0; i < this.Controls.Count; i++) // Forumdaki Toplam Kontrollerin sayısını alıyor.(Bunlar textboxlar,combolar,vs.vs)
            {
                if (this.Controls[i] is TextBox) //Diyorki eğer okuduğum kontrol (this.Controls Textbox ise işlem yapacam)
                {
                    TextBox c = (TextBox)this.Controls[i]; // c'nin içeriğine i. kontrolün içeriği aktarılıyor buda System.Windows.Textbox,Text: textboxun değeri
                    sayi = float.Parse(c.Text); // float türünden olanları ayrıştırıyor çünkü c'nin içeriğinde string falanda var.
                    toplam = toplam + sayi; //toplam ile bulduğumuz sayıyı topkuyor
                }
            }

Mantık şu Tüm kontrolleri sırayla denetle eğer bunlar textbox ise işlem yap.
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana