none
c# panel control combobox itemin dolu olup olmadığına göre değer getirme sorunu RRS feed

  • Soru

  • Merhaba,,,

    Aşağıda kod ile panelde var olan label ve comboboxlardan eğer combobox dolu ise o combobox değer ve karşılık gelen label textini almaya çalışıyorum ancak bir türlü başaramadım.

    bu değeri nasıl alabilirim acaba?

                foreach (Control c in panel1.Controls)
                    if (c is ComboBox)
                        if (c.Text.ToString() != "")//combobox boş değil ise
                        {
    
                            foreach (Control l in panel1.Controls)
                                if (l is Label)  //combobox dolu ise alınması gereken label
    
                                    MessageBox.Show(l.Text.ToString(), c.Text.ToString());/// boş olmayan combobox ve karşılık gelen label değerini almaya çalışıyorum
                        }
    


    koksal_tuna@hotmail.com

    2 Ekim 2019 Çarşamba 13:55

Yanıtlar

  • Dediğiniz gibi yaptım ancak şimdide;

     MessageBox.Show($@"Label: {l.Text},
                             ComboBox: {c.Text}");

    l.Text bölümünde I adı geçerli bağlamda yok hatası alıyorum...

    Çok soru sormuş oldum ama kusura bakmayın artık...


    koksal_tuna@hotmail.com

          Şöyle deneyin : 

         
    MessageBox.Show($@"Label: {label.Text},
                             ComboBox: {c.Text}");

          Faydası olsun da biz cevap vermekten sıkılmayız :) Çetin abinin kodunu satır satır inceleyecek olursak : 

          
    foreach (ComboBox c in panel1.Controls.OfType<ComboBox>())//panel1 üzerinde tipi Combobox olanlar üzerine foreach döngüsü
    {
       if (c.Text.ToString() != "")//combobox boş değil ise
       { 
         var lblName = c.Name.Replace("cmb", "lbl");//label ismini elde etme
         var label = panel1.Controls.OfType<Label> ().SingleOrDefault(l => l.Name == lblName);//panel üzerinde bulunan ve tipi Label olanlar üzerinde giderken adı lblName'e eşit olan label'ı getir yok ise null dön.
    
       if (label != null)//null değil ise böyle bir label bulduğunu anlıyoruz
        {
          MessageBox.Show($@"Label: {label.Text},
                             ComboBox: {c.Text}");//messagebox ile yazdır.
        }
       }
    }


    3 Ekim 2019 Perşembe 10:32
  • Aceleyle bazı ufak hatalar yapmisim:

    foreach (ComboBox c in panel1.Controls.OfType<ComboBox>())
    {
       if (!string.IsNullOrEmpty(c.Text))//combobox boş değil ise
       { 
         var lblName = c.Name.Replace("cmb", "lbl");
         var label = panel1.Controls.OfType<Label>().SingleOrDefault(l => l.Name == lblName);
       if (label != null)
        {
          MessageBox.Show($@"Label: {label.Text},
                             ComboBox: {c.Text}");
        }
       }
    }

     


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.



    3 Ekim 2019 Perşembe 10:35
  • Daha önce metin beyin önerisi ile labellerşe şu şekilde Name vermiştim...
     var attributeNode = categoryNode.SelectSingleNode("attributeList").SelectNodes("attribute");
                        for (int j = 0; j < attributeNode.Count; j++)
                        {
                            var name = attributeNode[j].SelectSingleNode("name").InnerText;
                            var mandatory = attributeNode[j].SelectSingleNode("mandatory").InnerText;
    
                            if (mandatory == "true")
                            {
                                Label A = new Label();
                                A.Name = "lblAd";
                                A.Text = (name + "*").ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                            }
                            if (mandatory == "false")
                            {
                                Label A = new Label();
                                A.Name = "lblAd";
                                A.Text = (name).ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                            }


    koksal_tuna@hotmail.com

    • Yanıt Olarak İşaretleyen KOKSAL TUNA 3 Ekim 2019 Perşembe 12:23
    3 Ekim 2019 Perşembe 12:11
  • Daha önce metin beyin önerisi ile labellerşe şu şekilde Name vermiştim...
     var attributeNode = categoryNode.SelectSingleNode("attributeList").SelectNodes("attribute");
                        for (int j = 0; j < attributeNode.Count; j++)
                        {
                            var name = attributeNode[j].SelectSingleNode("name").InnerText;
                            var mandatory = attributeNode[j].SelectSingleNode("mandatory").InnerText;
    
                            if (mandatory == "true")
                            {
                                Label A = new Label();
                                A.Name = "lblAd";
                                A.Text = (name + "*").ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                            }
                            if (mandatory == "false")
                            {
                                Label A = new Label();
                                A.Name = "lblAd";
                                A.Text = (name).ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                            }


    koksal_tuna@hotmail.com

          Panel üzerindeki her bir label kendine özgü bir isme (Name) sahip olmalı ki labellar arasından onu bulabilelim.

          lbl1,lbl2 bunlara karşılık cmb1,cmb2 comboboxları olmalı.İsimlendirmeyi düzelttiğiniz de sorununuz kalmayacak gibi duruyor.

          Biz comboboxlar üzerinde dönüp onların ismini alıp cmb1 buradaki cmbyi silip lbl yazıp lbl1'i elde ediyoruz.Mantığı bu şekilde , lbl1,lbl2 sadece bir örnekti isimlendirme konusunda özgürsünüz.

    • Yanıt Olarak İşaretleyen KOKSAL TUNA 3 Ekim 2019 Perşembe 12:23
    3 Ekim 2019 Perşembe 12:15

Tüm Yanıtlar

  • o öyle denk gelmez ki.

    "karşılık gelen label" ifadesinin kod tarafında bir karşılığı olmalı. Design Penceresinde yan yana geldi diye bunlari eşleyemezsiniz.

    Bence şöyle yapmalısınız; yeni bir usercontrol oluşturun buna bir label birde combobox ekleyin. tek bir controlün davranışını kodlayın. panelinizin içine bunlardan koyun. yani herbirisi kendi başına ne yapacağını bilsin.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    2 Ekim 2019 Çarşamba 15:35
  • Merhaba, Cevabınız için teşekkürler...

    kodu eksik yazdığım için bu şekilde düşünmeniz doğru kusura bakmayın...

    Aşağıdaki kodla karşılık gelen değerleri alıyorum yani her combonun ayrı bir labeli oluyor...

     if (categoryNode.SelectSingleNode("attributeList").SelectNodes("attribute").Count > 0)//ürünün opsiyonları Beden,Renk, Ayakkabı numarası gibi
                    {
                        var attributeNode = categoryNode.SelectSingleNode("attributeList").SelectNodes("attribute");
                        for (int j = 0; j < attributeNode.Count; j++)
                        {
                            var name = attributeNode[j].SelectSingleNode("name").InnerText;
                            var mandatory = attributeNode[j].SelectSingleNode("mandatory").InnerText;
    
                            if (mandatory == "true")
                            {
                                Label A = new Label();
                                A.Text = (name + "*").ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                            }
                            if (mandatory == "false")
                            {
                                Label A = new Label();
                                A.Text = (name).ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                            }
                            ComboBox B = new ComboBox();
    
                            B.Location = new Point(100, pointYY);
                            panel1.Controls.Add(B);
                            panel1.Show();
                            pointYY += 30;
    bu şekilde aldığım için sıra değişimi olmuyor sadece dediğim gibi combobox koşulu sağlanınca hangileri sağlanmışsa bunların labeli ve combobox değerini xmle kaydetmem gerekiyor... Ama nasıl yapabilirim hiçbir fikrim yok...

    koksal_tuna@hotmail.com

    2 Ekim 2019 Çarşamba 16:35
  • Label ve ComboBoxlara isim verseniz (Name = "lblAd", Name="cmbAd" gibi), panelin controls koleksiyonundan rahatlıkla istediğinizi alirdiniz. Kabaca:

    foreach (ComboBox c in panel1.Controls.OfType<ComboBox>())
    {
       if (c.Text.ToString() != "")//combobox boş değil ise
       { 
         var lblName = c.Name.Replace("cmb", "lbl");
         var label = panel1.Controls.OfType<Label>().SingleOrDefault(l => l.Name = lblName);
       if (label != null)
        {
          MessageBox.Show($@"Label: {l.Text},
                             ComboBox: {c.Text}");
        }
       }
    }
    

     


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    2 Ekim 2019 Çarşamba 18:45
  • Merhaba,

    Dediğiniz şekilde yapmaya çalıştım ancak 

    var label = panel1.Controls.OfType<Label>().SingleOrDefault(l => l.Name = lblName);
    bölümünde bool hatası veriyor acaba sorun ne olabilir?


    koksal_tuna@hotmail.com

    3 Ekim 2019 Perşembe 08:14
  • Merhaba,

    Dediğiniz şekilde yapmaya çalıştım ancak 

    var label = panel1.Controls.OfType<Label>().SingleOrDefault(l => l.Name = lblName);
    bölümünde bool hatası veriyor acaba sorun ne olabilir?


    koksal_tuna@hotmail.com

          Aşağıdaki kısmı değiştirin : 

         
    //before
    SingleOrDefault(l => l.Name = lblName);
    
    
    //after
    SingleOrDefault(l => l.Name == lblName);

    3 Ekim 2019 Perşembe 08:51
  • Dediğiniz gibi yaptım ancak şimdide;

     MessageBox.Show($@"Label: {l.Text},
                             ComboBox: {c.Text}");

    l.Text bölümünde I adı geçerli bağlamda yok hatası alıyorum...

    Çok soru sormuş oldum ama kusura bakmayın artık...


    koksal_tuna@hotmail.com

    3 Ekim 2019 Perşembe 09:15
  • Dediğiniz gibi yaptım ancak şimdide;

     MessageBox.Show($@"Label: {l.Text},
                             ComboBox: {c.Text}");

    l.Text bölümünde I adı geçerli bağlamda yok hatası alıyorum...

    Çok soru sormuş oldum ama kusura bakmayın artık...


    koksal_tuna@hotmail.com

          Şöyle deneyin : 

         
    MessageBox.Show($@"Label: {label.Text},
                             ComboBox: {c.Text}");

          Faydası olsun da biz cevap vermekten sıkılmayız :) Çetin abinin kodunu satır satır inceleyecek olursak : 

          
    foreach (ComboBox c in panel1.Controls.OfType<ComboBox>())//panel1 üzerinde tipi Combobox olanlar üzerine foreach döngüsü
    {
       if (c.Text.ToString() != "")//combobox boş değil ise
       { 
         var lblName = c.Name.Replace("cmb", "lbl");//label ismini elde etme
         var label = panel1.Controls.OfType<Label> ().SingleOrDefault(l => l.Name == lblName);//panel üzerinde bulunan ve tipi Label olanlar üzerinde giderken adı lblName'e eşit olan label'ı getir yok ise null dön.
    
       if (label != null)//null değil ise böyle bir label bulduğunu anlıyoruz
        {
          MessageBox.Show($@"Label: {label.Text},
                             ComboBox: {c.Text}");//messagebox ile yazdır.
        }
       }
    }


    3 Ekim 2019 Perşembe 10:32
  • Aceleyle bazı ufak hatalar yapmisim:

    foreach (ComboBox c in panel1.Controls.OfType<ComboBox>())
    {
       if (!string.IsNullOrEmpty(c.Text))//combobox boş değil ise
       { 
         var lblName = c.Name.Replace("cmb", "lbl");
         var label = panel1.Controls.OfType<Label>().SingleOrDefault(l => l.Name == lblName);
       if (label != null)
        {
          MessageBox.Show($@"Label: {label.Text},
                             ComboBox: {c.Text}");
        }
       }
    }

     


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.



    3 Ekim 2019 Perşembe 10:35
  • offf. Kafayı yemek üzereyim ...

    Şimdide;

    SingleOrDefault

    alanında hata veriyor (Sıra birden çok eşleşen öğe içeriyor)

    oysaki gelen veride eşeleşen hiçbir öğe yok.

    bu problemide çözebilirsek çözüm sonlanmış olacak umarım :(


    koksal_tuna@hotmail.com

    3 Ekim 2019 Perşembe 11:15
  • SingleOrDefault'un içerisine yazdığınız koşula uyan birden fazla öğe var bu durumda singleOrDefault hata fırlatıyor gibi duruyor.Panel1 içerisinde bulunan label isimlerini (Name özelliğini) kontrol etmelisiniz.


    3 Ekim 2019 Perşembe 12:03
  • Daha önce metin beyin önerisi ile labellerşe şu şekilde Name vermiştim...
     var attributeNode = categoryNode.SelectSingleNode("attributeList").SelectNodes("attribute");
                        for (int j = 0; j < attributeNode.Count; j++)
                        {
                            var name = attributeNode[j].SelectSingleNode("name").InnerText;
                            var mandatory = attributeNode[j].SelectSingleNode("mandatory").InnerText;
    
                            if (mandatory == "true")
                            {
                                Label A = new Label();
                                A.Name = "lblAd";
                                A.Text = (name + "*").ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                            }
                            if (mandatory == "false")
                            {
                                Label A = new Label();
                                A.Name = "lblAd";
                                A.Text = (name).ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                            }


    koksal_tuna@hotmail.com

    • Yanıt Olarak İşaretleyen KOKSAL TUNA 3 Ekim 2019 Perşembe 12:23
    3 Ekim 2019 Perşembe 12:11
  • Daha önce metin beyin önerisi ile labellerşe şu şekilde Name vermiştim...
     var attributeNode = categoryNode.SelectSingleNode("attributeList").SelectNodes("attribute");
                        for (int j = 0; j < attributeNode.Count; j++)
                        {
                            var name = attributeNode[j].SelectSingleNode("name").InnerText;
                            var mandatory = attributeNode[j].SelectSingleNode("mandatory").InnerText;
    
                            if (mandatory == "true")
                            {
                                Label A = new Label();
                                A.Name = "lblAd";
                                A.Text = (name + "*").ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                            }
                            if (mandatory == "false")
                            {
                                Label A = new Label();
                                A.Name = "lblAd";
                                A.Text = (name).ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                            }


    koksal_tuna@hotmail.com

          Panel üzerindeki her bir label kendine özgü bir isme (Name) sahip olmalı ki labellar arasından onu bulabilelim.

          lbl1,lbl2 bunlara karşılık cmb1,cmb2 comboboxları olmalı.İsimlendirmeyi düzelttiğiniz de sorununuz kalmayacak gibi duruyor.

          Biz comboboxlar üzerinde dönüp onların ismini alıp cmb1 buradaki cmbyi silip lbl yazıp lbl1'i elde ediyoruz.Mantığı bu şekilde , lbl1,lbl2 sadece bir örnekti isimlendirme konusunda özgürsünüz.

    • Yanıt Olarak İşaretleyen KOKSAL TUNA 3 Ekim 2019 Perşembe 12:23
    3 Ekim 2019 Perşembe 12:15
  •  if (categoryNode.SelectSingleNode("attributeList").SelectNodes("attribute").Count > 0)//ürünün opsiyonları Beden,Renk, Ayakkabı numarası gibi
                    {
                        var attributeNode = categoryNode.SelectSingleNode("attributeList").SelectNodes("attribute");
                        for (int j = 0; j < attributeNode.Count; j++)
                        {
                            var name = attributeNode[j].SelectSingleNode("name").InnerText;
                            var mandatory = attributeNode[j].SelectSingleNode("mandatory").InnerText;
    
                            if (mandatory == "true")
                            {
                                var labelname = string.Concat("lblAd",j);
                                Label A = new Label();
                                A.Name = labelname;
                                A.Text = (name + "*").ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                             
                            }
                            if (mandatory == "false")
                            {
                                var labelname = string.Concat("lblAd", j);
                                Label A = new Label();
                                A.Name = labelname;
                                A.Text = (name).ToString();
                                A.Location = new Point(0, pointY);
                                panel1.Controls.Add(A);
                                panel1.Show();
                                pointY += 30;
                              
                            }
                            var comboboxname = string.Concat("cmbAd", j);
                            ComboBox B = new ComboBox();
                            B.Name = comboboxname;
                            B.Location = new Point(100, pointYY);
                            panel1.Controls.Add(B);
                            panel1.Show();
                            pointYY += 30;

    evet şimdi oldu isimlendirmeyi for döngüsü ile ekleme yaparak sorun çözülmüş oldu...

    emeğiniz ve zaman ayırdığınız için çok teşekkürler...

     foreach (ComboBox c in panel1.Controls.OfType<ComboBox>())//panel1 üzerinde tipi Combobox olanlar üzerine foreach döngüsü
                {
                    if (c.Text.ToString() != "")//combobox boş değil ise
                    {
                        var lblName = c.Name.Replace("cmb", "lbl");//label ismini elde etme
                        var label = panel1.Controls.OfType<Label>().SingleOrDefault(l => l.Name == lblName);//panel üzerinde bulunan ve tipi Label olanlar üzerinde giderken adı lblName'e eşit olan label'ı getir yok ise null dön.
                        if (label != null)//null değil ise böyle bir label bulduğunu anlıyoruz
                        {
                            MessageBox.Show($@"Label: {label.Text},
                             ComboBox: {c.Text}");//messagebox ile yazdır.
                        }

    koksal_tuna@hotmail.com

    3 Ekim 2019 Perşembe 12:23
  • offf. Kafayı yemek üzereyim ...

    Şimdide;

    SingleOrDefault

    alanında hata veriyor (Sıra birden çok eşleşen öğe içeriyor)

    oysaki gelen veride eşeleşen hiçbir öğe yok.

    bu problemide çözebilirsek çözüm sonlanmış olacak umarım :(


    koksal_tuna@hotmail.com

    Birden fazla kontrole ayni ismi vermemelisiniz.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    3 Ekim 2019 Perşembe 12:41
  • Ben olsam for döngüsüne filan güvenmeden yapmaya tercih ederdim (metin bey kim bilmiyorum). Tekrarlari önlemektedir icin ben şöyle yazardim:

    if (categoryNode.SelectSingleNode("attributeList").SelectNodes("attribute").Count > 0)//ürünün opsiyonları Beden,Renk, Ayakkabı numarası gibi
    {
    	var attributeNode = categoryNode.SelectSingleNode("attributeList").SelectNodes("attribute");
    	for (int j = 0; j < attributeNode.Count; j++)
    	{
    		var name = attributeNode[j].SelectSingleNode("name").InnerText;
    		var mandatory = bool.Parse(attributeNode[j].SelectSingleNode("mandatory").InnerText);
    
    		var cNameSuffix = Guid.NewGuid().ToString("N");
    
    		Label A = new Label();
    		A.Name = $"lbl{cNameSuffix}";
    		A.Location = new Point(0, pointY);
    		A.Text = mandatory ? $"{name}*" : name;
    		panel1.Controls.Add(A);
    		panel1.Show();
    		pointY += 30;
    
    		ComboBox B = new ComboBox();
    		B.Name = $"cmb{cNameSuffix}";
    		B.Location = new Point(100, pointYY);
    		panel1.Controls.Add(B);
    		panel1.Show();
    		pointYY += 30;
    	}
    }
    Not: Tabii o combonun icini bir sekilde dolduruyorsundur.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    3 Ekim 2019 Perşembe 12:55