Laden...

Problem mit einem Checkedlistbox: Auf ID des markierten Eintrags zugreifen

Letzter Beitrag vor 21 Jahren 5 Posts 4.952 Views
Problem mit einem Checkedlistbox: Auf ID des markierten Eintrags zugreifen

Hi,
hab eine Tabelle mit Daten erstellt. Anschließend wird einer CheckedListBox die Werte von der Tabelle geladen. Nun ist mein Problem, ich würde gerne nach dem Markieren die ID haben die bei der Liste als ValueMember genutzt wird.


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

namespace WindowsApplication1
{
	/// <summary>
	/// Zusammendfassende Beschreibung für Form1.
	/// </summary>
	public class Form1 : System.Windows.Forms.Form
	{
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		private System.ComponentModel.Container components = null;
		private System.Windows.Forms.TextBox textBox1;
		private System.Windows.Forms.CheckedListBox listBox1;
		private System.Windows.Forms.Button button1;

		DataSet set = new DataSet("dataset");

		public Form1()
		{
			//
			// Erforderlich für die Windows Form-Designerunterstützung
			//
			InitializeComponent();

			//
			// TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
			//
			tab();
			anzeige();
		}

		/// <summary>
		/// Die verwendeten Ressourcen bereinigen.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Windows Form Designer generated code
		/// <summary>
		/// Erforderliche Methode für die Designerunterstützung. 
		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
		/// </summary>
		private void InitializeComponent()
		{
			this.textBox1 = new System.Windows.Forms.TextBox();
			this.listBox1 = new System.Windows.Forms.CheckedListBox();
			this.button1 = new System.Windows.Forms.Button();
			this.SuspendLayout();
			// 
			// textBox1
			// 
			this.textBox1.Location = new System.Drawing.Point(8, 120);
			this.textBox1.Name = "textBox1";
			this.textBox1.TabIndex = 1;
			this.textBox1.Text = "textBox1";
			// 
			// listBox1
			// 
			this.listBox1.Location = new System.Drawing.Point(0, 8);
			this.listBox1.Name = "listBox1";
			this.listBox1.Size = new System.Drawing.Size(120, 94);
			this.listBox1.TabIndex = 2;
			this.listBox1.SelectedIndexChanged += new System.EventHandler(this.indexchange);
			// 
			// button1
			// 
			this.button1.Location = new System.Drawing.Point(8, 160);
			this.button1.Name = "button1";
			this.button1.TabIndex = 3;
			this.button1.Text = "button1";
			this.button1.Click += new System.EventHandler(this.button1_Click);
			// 
			// Form1
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(292, 273);
			this.Controls.AddRange(new System.Windows.Forms.Control[] {
																		  this.button1,
																		  this.listBox1,
																		  this.textBox1});
			this.Name = "Form1";
			this.Text = "Form1";
			this.ResumeLayout(false);

		}
		#endregion

		/// <summary>
		/// Der Haupteinstiegspunkt für die Anwendung.
		/// </summary>
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}

		public void tab()
		{
			// Neue Tabelle erstellen
			DataTable tab = new DataTable("dat");

			// Spalte 1 erstellen
			DataColumn col1 = new DataColumn("Spalte1");
			col1.ColumnName = "Spalte1";


			// Spalte 2 erstellen
			DataColumn col2 = new DataColumn("Spalte2");
			col2.ColumnName = "Spalte2";


			// Spalten zur Tabelle einfügen                           
			tab.Columns.AddRange(new DataColumn[] {col1,col2});

			// Neue Daten hinzufügen
			DataRow row;

			row = tab.NewRow();
			
			row["Spalte1"] = 10;
			row["Spalte2"] = "Hallo";

			tab.Rows.Add(row);


			DataRow row2;

			row2 = tab.NewRow();
			
			row2["Spalte1"] = 20;
			row2["Spalte2"] = "Morgen";

			tab.Rows.Add(row2);


			/*
			DataGrid grid = new DataGrid();
			grid.Location = new Point(0,0);
			grid.Size = new Size(300,200);
			grid.DataSource = tab;
			this.Controls.Add(grid);
			*/
			
			// Dataset eine Tabelle hinzufügen
			set.Tables.Add(tab);
			//set.WriteXml("x.xml");
			
		}

		public void anzeige()
		{
			listBox1.DataSource = set.Tables[0];
			listBox1.DisplayMember = set.Tables[0].Columns["Spalte2"].ToString();
			listBox1.ValueMember = set.Tables[0].Columns["Spalte1"].ToString();
		}

		private void indexchange(object sender, System.EventArgs e)
		{
			textBox1.Text = listBox1.SelectedValue.ToString();
		}

		private void button1_Click(object sender, System.EventArgs e)
		{
			string x = null;
			
			for(int i=0;i < listBox1.CheckedItems.Count; i++)
			{
				x += listBox1.CheckedIndices[i].ToString();
				x += "
";
			}

			
			MessageBox.Show(x);

		}
	}
}

Hi!

Meinst du mit Liste Tabelle oder die CLB?

Hier einfach mal die Indexermittlung aller aktivierten Kontrollkästchen.
Ich kann dir sagen wie du den Index eines CheckedListBox-Objekts ermittelst:
CheckedListBox.CheckedIndexCollection speichert die Indizes aller Elemente, deren Kontrollkästchen markiert sind oder einen unbestimmten Status aufweisen.
Die Eigenschaft CheckedIndices liefert einen Verweis auf das CheckedIndexCollection-Objekt:

CheckedListBox.CheckedIndexCollection ci = null;
ci = checkedListBox.CheckedIndices

Wenn du den neuen Zustand eines Kästchen ermitteln willst, dann geht es so:
NewValue Der CheckState-Wert, der den neuen Zustand des Kontrollkästchens beschreibt.
Diese Eigenschaften werden in dem folgenden Beispiel für die Bearbeitung des Ereignisses ItemCheck verwendet:

private void OnItemCheck(object sender,         
                         System.Windows.Forms.ItemCheckEventArgs e)
{
    int index = e.Index;
    if(e.NewValue == CheckState.Checked)
    {
        Sailboat boat = (Sailboat)checkedListBox.Items[index];
        string msg = string.Format("Add {0} to the list of sold boats?",
                                    boat.Name);
        DialogResult result = MessageBox.Show(msg,
                                              "Confirm",
                                              MessageBoxButtons.YesNo,
                                              MessageBoxIcon.Question);
        if(result == DialogResult.Yes)
        {
            // Das Boot ist verkauft.
            listBox.Items.Add(boat);
        }
    }
}

Ich hoffe das hat dir weitergeholfen.

Code-Hacker

Hi,
das war nicht ganz das was ich meinte. Und zwar hab ich ne Tabelle angelegt und die Daten anschließend in DataSet geschrieben. Nun Stelle ich die Daten in der Listbox dar. Hierzu wird die DataSource von der Listboxeigenschaften angegeben und auf die erstellte Tabelle im DataSet gelinkt. Nun würde ich gerne anhand der getroffenen Auswahl aus der Listbox die dazugehörigen DatenSätze aus dem DataSet ausgeben lassen.

Du zeigst also alle Datensätze in der CLB an und wenn man den kram auswählt dann soll er diesen Datensat ausspucken. Guck doch mal hier da habe ich jemandem gesagt wie erdarauf zugreifen kann. Mein erster Vorschlag der da steht funktioniert aber nicht, müsstest du sonst nochmal etwas rumprobieren.
Sollte das auch nicht das richtige dann werde ich mich darum kümmern mal etwas rauszusuchen. Da ich momentan etwas im Stress bin, habe ich nicht so die Zeit, deswegen kann das etwas dauern. Brauchste das bis zu einem bestimmten Termin?

Code-Hacker

Bis zu einem bestimmten termin bräuchte ich dies eigentlich nicht!!!