Entwickler-Ecke

WinForms - Form starten mit Werten für eine Auswahlliste


Blacknitram - Mi 28.04.10 15:14
Titel: Form starten mit Werten für eine Auswahlliste
hi
Ich habe ein Problem Ich starte Form mit:


C#-Quelltext
1:
2:
3:
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
System.Windows.Forms.Application.Run(new Form2(NameToForm));


NameToForm ist eine List mit mehreren Namen.
Und dann in Forms habe ich eine CheckedListBox in der die Namen ausgewählt werden können
Aber im wenn ich es durch laufen lasse werden im Forms keine CheckBoxen erzeugt und das Button Click funktioniert auch nicht


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
public partial class Form2 : Form
 {
  List<String> ergebnis = new List<string>();
  public Form2(List<String> NameAusBib)
   {
     ergebnis = null;
     InitializeComponent();
     checkListBox = new CheckedListBox();
     checkListBox.Location = new Point(1028);
     checkListBox.Size = new Size(271180);
     checkListBox.Text = "Namen";
     foreach (String Name in NameAusBib)
      {
        checkListBox.Items.Add(Text = Name);
      }
   }
   private void buttonOK_Click(object sender, EventArgs e)
    {
     if (checkListBox.SelectedItem.ToString() != null)
     {
       ergebnis.Add(checkListBox.SelectedItem.ToString());
     }
     else
     {
       MessageBox.Show("Wählen Sie minderstens einen Namen aus.""Kein Namen Ausgewählt", MessageBoxButtons.OK, 
            MessageBoxIcon.Exclamation);
     }
     this.Close();
     }
     CheckedListBox checkListBox;
}

Ich hoffe das mir einer helfen kann.

lg
Martin


JüTho - Mi 28.04.10 18:06

Hallo,

du machst auf jeden Fall einen gravierenden Fehler: Beim Erstellen der Klasse wird der Variablen ergebnis zuerst eine neue Liste zugewiesen, dann kommt der Konstruktor und setzt die Variable ergebnis auf null. Was soll das?

Mit der CheckedListBox habe ich mich noch nicht befasst. Sollte es nicht auch so gehen:

C#-Quelltext
1:
checkListBox.Items.AddRange(NameAusBib);                    

ToString() mit null zu vergleichen kommt mir auch komisch vor. Kann die checkListBox nicht mehrere Items auswählen? Ein String wird ggf. mit IsNullOrEmpty verglichen.

Gruß Jürgen


Kha - Mi 28.04.10 20:53

Außerdem muss die CheckedListBox noch this.Controls hinzugefügt werden. Aber warum sie überhaupt im Code und nicht im Designer erstellen?


Blacknitram - Fr 30.04.10 11:01

danke es funktioniert jetzt.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
public partial class Form2 : Form
{
    List<String> NameToBib = new List<String>();
    public Form2(List<String> NameAusBib)
    {
        InitializeComponent();
        int i = NameAusBib.Count;
        this.checkedListBox1.Items.AddRange(new object[] { NameAusBib[0] });
        for (int alle = 1; i > alle; alle++)
        {
           this.checkedListBox1.Items.Add(NameAusBib[alle]);
        }

    }
    private void buttonOK_Click(object sender, EventArgs e)
    {
        foreach (object itemChecked in checkedListBox1.CheckedItems)
        {
           NameToBib.Add(itemChecked.ToString());
        }
        MessageBox.Show("\nErgebnis inhalt wie Viel: " + NameToBib.Count);
        this.Close();
    }
}

aber ich weis nicht wie ich die List NameToBib mit den abgespeicherten Werten, die ausgewählt wurden, wieder in die Klassenbibliothek zurück bekomme aus der ich Form2 gestartet habe.

lg
Martin


danielf - Fr 30.04.10 11:31

Hallo,

um die Werte aus dem Form zu bekommen musst du eine Schnittstelle definieren. Das kann eine öffentlichen Methode oder eine Eigenschaft sein.

Ich würde in deinem Fall ein Property nehmen (wie bei der CheckListBox [http://msdn.microsoft.com/de-de/library/system.windows.forms.checkedlistbox_properties%28v=VS.100%29.aspx] selbst). Darüber könntest du auch dann die Initialisierung machen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
class Form2 : Form
{
   public IEnumerable<string> Items { 
      set { 
         this.checkedListBox1.Items.Clear();
         this.checkedListBox1.Items.AddRange(value.ToArray());
      }
      get { this.checkedListBox1.Items.Cast<string>(); }
   }
   public List<string> CheckedItems
   {
      set { 
        for (int i = 0; i < cbl.Items.Count; i++)
        {
           this.checkedListBox1.SetItemChecked(i, value != null && value.Contains<string>(item));
        }
      }
      get { this.checkedListBox1.CheckedItems.Cast<string>(); }
   }
   public Form2(List<string> items)
   {
      Items = items;
   }
}


Gruß


danielf - Fr 30.04.10 15:32

Hmm.. der Code war ziemlich unsauber, deshalb nochmal den Code für das CheckedItems Property:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        public IEnumerable<string> CheckedItems
        {
            set
            {
                for (int i = 0; i < this.cbl.Items.Count; i++)
                {
                    this.cbl.SetItemChecked(i, value != null && value.Contains<string>((string) cbl.Items[i]));
                }
            }
            get { return this.cbl.CheckedItems.Cast<string>(); }
        }