Discussion:
(Checked)ListBox: Items-Auflistung durchlaufen
(zu alt für eine Antwort)
Frank Boehland
2006-09-13 13:45:01 UTC
Permalink
Ein Hallo,

wie gelingt es mir, die Items-Auflistung einer CheckedListBox (oder auch
einer normalen ListBox) zu durchlaufen und Eigenschaften diverser Items (z.B.
Checked) zu ändern?

Da es ein "ListBoxItem" offenbar nicht unter Windows Forms gibt, bleibt mir
nur:

foreach( object item in checkedListBox.Items )
{ ...

Das Objekt "item" hat natürlich nicht die spezifischen Eigenschaften der
Listbox. Eine Typwandlung mit dem Castoperator ist mir auch nicht gelungen
(InvalidCastException). Wie also???

Ich danke euch für den oder die entscheidenden Hinweise.

Frank
Frank Dzaebel
2006-09-13 14:15:01 UTC
Permalink
Hallo Frank,
Post by Frank Boehland
wie gelingt es mir, die Items-Auflistung einer CheckedListBox (oder auch
einer normalen ListBox) zu durchlaufen und Eigenschaften diverser Items (z.B.
Checked) zu ändern?
Da es ein "ListBoxItem" offenbar nicht unter Windows Forms gibt, bleibt mir
nur: foreach( object item in checkedListBox.Items )
Man macht es dort etwas anders, also mit
checkedListBox1.CheckedIndices und -CheckedItems zum
Beispiel. Schau Dir mal das Beispiel hier an:

[CheckedListBox.Items-Eigenschaft
http://msdn2.microsoft.com/de-de/library/system.windows.forms.checkedlistbox.items.aspx

Wenn Du Deinen Code nimmst, würde man
im einfachsten Fall in (string) casten:

foreach(object item in checkedListBox.Items)
if (item is string) MessageBox.Show((string)item);

und erhielte die Texte.


ciao Frank
--
Dipl. Inf. Frank Dzaebel [MCP, MVP C#]
http://Dzaebel.NET
Frank Boehland
2006-09-13 14:32:02 UTC
Permalink
Hallo Frank,
Post by Frank Dzaebel
Man macht es dort etwas anders, also mit
checkedListBox1.CheckedIndices und -CheckedItems zum
Beispiel ...
das setzt ja eine CheckedItems-Auflistung voraus, also eine Liste bereits
markierter Einträge. Mein Ziel ist es, die Box zunächst mit nicht markierten
Einträgen zu füllen und später definierte Einträge zu markieren. Das
Ansprechen dieser Einträge und die Möglichkeit, Checked zu setzen gelingt mir
nicht.

Vielleicht sollte ich diesen Sachverhalt aber auch in oder mit einem anderen
Control darstellen?!

Viele Grüße
Frank
Post by Frank Dzaebel
Hallo Frank,
Post by Frank Boehland
wie gelingt es mir, die Items-Auflistung einer CheckedListBox (oder auch
einer normalen ListBox) zu durchlaufen und Eigenschaften diverser Items (z.B.
Checked) zu ändern?
Da es ein "ListBoxItem" offenbar nicht unter Windows Forms gibt, bleibt mir
nur: foreach( object item in checkedListBox.Items )
Man macht es dort etwas anders, also mit
checkedListBox1.CheckedIndices und -CheckedItems zum
[CheckedListBox.Items-Eigenschaft]
http://msdn2.microsoft.com/de-de/library/system.windows.forms.checkedlistbox.items.aspx
Wenn Du Deinen Code nimmst, würde man
foreach(object item in checkedListBox.Items)
if (item is string) MessageBox.Show((string)item);
und erhielte die Texte.
ciao Frank
--
Dipl. Inf. Frank Dzaebel [MCP, MVP C#]
http://Dzaebel.NET
Arne Janning
2006-09-13 14:39:40 UTC
Permalink
Hallo Frank,
Post by Frank Boehland
das setzt ja eine CheckedItems-Auflistung voraus, also eine Liste bereits
markierter Einträge. Mein Ziel ist es, die Box zunächst mit nicht markierten
Einträgen zu füllen und später definierte Einträge zu markieren. Das
Ansprechen dieser Einträge und die Möglichkeit, Checked zu setzen gelingt mir
nicht.
Dann so:

//CheckedListBox mit "Hallo" und "Welt" füllen
private void button1_Click(object sender, EventArgs e)
{
checkedListBox1.Items.AddRange(
new string[] { "Hallo", "Welt" });
}

//Eintrag mit "Welt" markieren
private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < checkedListBox1.Items.Count - 1; i++)
{
if (checkedListBox1.Items[i].ToString() == "Welt")
{
checkedListBox1.SetItemCheckState(i, CheckState.Checked);
}
}
}

Liebe Grüße

Arne Janning
Frank Dzaebel
2006-09-13 15:06:01 UTC
Permalink
Hallo Arne,
Post by Arne Janning
//Eintrag mit "Welt" markieren
private void button2_Click(object sender, EventArgs e)
{ for (int i = 0; i < checkedListBox1.Items.Count - 1; i++)
{ if (checkedListBox1.Items[i].ToString() == "Welt")
{ checkedListBox1.SetItemCheckState(i, CheckState.Checked);
}
}
}
Dann besser so:
int index = checkedListBox1.Items.IndexOf("Welt");
checkedListBox1.SetItemCheckState(index, CheckState.Checked);


ciao Frank
--
Dipl. Inf. Frank Dzaebel [MCP, MVP C#]
http://Dzaebel.NET
Herfried K. Wagner [MVP]
2006-09-13 15:25:02 UTC
Permalink
Hallo Frank!
Post by Frank Dzaebel
Post by Arne Janning
//Eintrag mit "Welt" markieren
private void button2_Click(object sender, EventArgs e)
{ for (int i = 0; i < checkedListBox1.Items.Count - 1; i++)
{ if (checkedListBox1.Items[i].ToString() == "Welt")
{ checkedListBox1.SetItemCheckState(i, CheckState.Checked);
}
}
}
int index = checkedListBox1.Items.IndexOf("Welt");
checkedListBox1.SetItemCheckState(index, CheckState.Checked);
... oder (sicherheitshalber zurückgegebenen Index prüfen!):

\\\
int index = this.CheckedListBox1.FindStringExact("Welt");
if (index != ListBox.NoMatches)
this.CheckedListBox1.SetItemChecked(index, true);
///
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>
Frank Dzaebel
2006-09-13 16:00:01 UTC
Permalink
Hallo Herfried,
Post by Frank Dzaebel
int index = checkedListBox1.Items.IndexOf("Welt");
wollte ich zunächst auch dazuzuschreiben, merkte
aber, dass hier evtl. besser die string-Sicherheit eine
Ebene höher zu legen ist. Es entfiele so ein unnützer
Check. Etwa so (eine Möglichkeit):

static class CheckItems
{
static public string Eins = "Eins";
static public string Zwei = "Zwei";
}

private void Form1_Load(object sender, EventArgs e)
{
FieldInfo[] ps = typeof(CheckItems).GetFields();
foreach(FieldInfo fi in ps) checkedListBox1.Items.Add(fi.Name);
}

private void button1_Click(object sender, EventArgs e)
{
int index = checkedListBox1.Items.IndexOf(CheckItems.Zwei);
checkedListBox1.SetItemCheckState(index, CheckState.Checked);
}
// ggf. besser noch über Enums realisieren.


Es kommt auch darauf an, ob dynamische Strings
gewünscht sind. Das alles ist noch offen und deswegen
hier *noch* kein Verfahren zur Prüfung zu empfehlen.


ciao Frank
--
Dipl. Inf. Frank Dzaebel [MCP, MVP C#]
http://Dzaebel.NET
Frank Dzaebel
2006-09-13 14:46:01 UTC
Permalink
Hallo Frank,
Mein Ziel ist es, die Box zunächst mit nicht markierten Einträgen
zu füllen
Dann z.B. so:
this.checkedListBox1.Items.AddRange(
new object[] {"Eins","Zwei","Drei"});
und später definierte Einträge zu markieren. Das
Ansprechen dieser Einträge und die Möglichkeit,
Checked zu setzen gelingt mir nicht.
Zum Beispiel:
checkedListBox1.SetItemChecked(1, true);
Vielleicht sollte ich diesen Sachverhalt aber auch in
oder mit einem anderen Control darstellen?!
Um das zu beurteilen, müsste ich/wir wohl den
Hintergrund/das Zeil der Aufgabe haben.


ciao Frank
--
Dipl. Inf. Frank Dzaebel [MCP, MVP C#]
http://Dzaebel.NET
Herfried K. Wagner [MVP]
2006-09-13 15:03:22 UTC
Permalink
Post by Frank Boehland
wie gelingt es mir, die Items-Auflistung einer CheckedListBox (oder auch
einer normalen ListBox) zu durchlaufen und Eigenschaften diverser Items (z.B.
Checked) zu ändern?
Bei der CheckedListBox schau dir die Methoden 'SetItemChecked' und
'SetItemCheckState' an.
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>
Loading...