none
ComboBox RRS feed

  • Frage

  • Hallo,

    ich habe ein DataTable + DataView + DataRowView + ComboBox mit viel Daten.

    Die Daten aus DataTable sortiere ich nach einer Spalte und trage alle in ein ComboBox je in eine Zeile.

    Wenn ich irgend einen neuen Datensatz einfüge oder ändere, ändert sich die Rheinfolge in DataView => trage die Datensätze in ComboBox neu ein. Danach will ich den geänderten oder neueingefügten Datensatz wieder finden und als ComboBox.SelectedIndex = x; wieder selektieren.

    Frage: wie kann ich den Datensatz wieder finden und als selectedIndex in ComboBox setzen ?

    mfg

    Samstag, 13. Juni 2020 19:43

Antworten

  • Hi,
    hier mal eine kleine Demo zu deinem Problem. Sortiert wird die implizit in einer BindingSource enthaltene DataView. Nach dem Hinzufügen wird dann ein EndEdit ausgeführt, was automatisch auf das nächste Datenelement in der Sortierfolge positioniert. Mit einem Move wird dann zurück auf den eingefügten Datensatz positioniert. Die aktuelle Position kann dann ausgelesen werden.

    using System;
    using System.Data;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private Button btn = new Button() { Text = "Add", Dock = DockStyle.Top };
        private ComboBox cb = new ComboBox() { Dock = DockStyle.Top , DisplayMember="Number"};
        private DataGridView dgv = new DataGridView() { Dock = DockStyle.Fill };
        private DataTable dt = new DataTable();
        private BindingSource bs = new BindingSource();
        private Random rnd = new Random();
    
        private void Form1_Load(object sender, EventArgs e)
        {
          this.Controls.AddRange(new Control[] { dgv, cb, btn });
          btn.Click += Btn_Click;
          GetData();
          bs.DataSource = dt;
          bs.Sort = "Number";
          dgv.DataSource = bs;
          cb.DataSource = bs;
        }
    
        private void Btn_Click(object sender, EventArgs e)
        {
          var row = (DataRowView)bs.AddNew();
          row.Row["Number"] = rnd.Next(0, 1000);
          bs.EndEdit();
          bs.MovePrevious();
        }
    
        private void GetData()
        {
          var col = dt.Columns.Add("ID", typeof(int));
          col.AutoIncrement = true;
          col.AutoIncrementSeed = 1;
          col.AutoIncrementStep = 1;
          dt.Columns.Add("Number", typeof(int));
          for (int i = 1; i < 100; i++) dt.Rows.Add(i, rnd.Next(0, 1000));
        }
      }
    }
    


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    • Als Antwort markiert ati.sah Dienstag, 16. Juni 2020 11:13
    Sonntag, 14. Juni 2020 06:34

Alle Antworten

  • Hi,
    hier mal eine kleine Demo zu deinem Problem. Sortiert wird die implizit in einer BindingSource enthaltene DataView. Nach dem Hinzufügen wird dann ein EndEdit ausgeführt, was automatisch auf das nächste Datenelement in der Sortierfolge positioniert. Mit einem Move wird dann zurück auf den eingefügten Datensatz positioniert. Die aktuelle Position kann dann ausgelesen werden.

    using System;
    using System.Data;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private Button btn = new Button() { Text = "Add", Dock = DockStyle.Top };
        private ComboBox cb = new ComboBox() { Dock = DockStyle.Top , DisplayMember="Number"};
        private DataGridView dgv = new DataGridView() { Dock = DockStyle.Fill };
        private DataTable dt = new DataTable();
        private BindingSource bs = new BindingSource();
        private Random rnd = new Random();
    
        private void Form1_Load(object sender, EventArgs e)
        {
          this.Controls.AddRange(new Control[] { dgv, cb, btn });
          btn.Click += Btn_Click;
          GetData();
          bs.DataSource = dt;
          bs.Sort = "Number";
          dgv.DataSource = bs;
          cb.DataSource = bs;
        }
    
        private void Btn_Click(object sender, EventArgs e)
        {
          var row = (DataRowView)bs.AddNew();
          row.Row["Number"] = rnd.Next(0, 1000);
          bs.EndEdit();
          bs.MovePrevious();
        }
    
        private void GetData()
        {
          var col = dt.Columns.Add("ID", typeof(int));
          col.AutoIncrement = true;
          col.AutoIncrementSeed = 1;
          col.AutoIncrementStep = 1;
          dt.Columns.Add("Number", typeof(int));
          for (int i = 1; i < 100; i++) dt.Rows.Add(i, rnd.Next(0, 1000));
        }
      }
    }
    


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    • Als Antwort markiert ati.sah Dienstag, 16. Juni 2020 11:13
    Sonntag, 14. Juni 2020 06:34
  • Hallo, es ist sehr schöner Bspl.

    bei der Umstzung zum meinem Prog. habe noch paar Fregen ?

    1. wie kann ich in cb verschiedene Spalten der dt kombinieren z.B cb.Item = Name +" " + Nachname;

    2. oder die anderen Spalten aus der dt wie z.B. textBox1.Text = Name; textBox2.Text = Nachname; zum Anzeigen/Ändern der Spalten ?

    mfg


    • Bearbeitet ati.sah Mittwoch, 17. Juni 2020 14:32
    Mittwoch, 17. Juni 2020 13:21
  • Hi,
    für die Verknüpfung der Textinformation aus 2 Spalten gibt es verschiedene Möglichkeiten. Welche davon die Beste ist, hängt von den weiteren zu realisierenden Bedingungen ab. In WPF wäre das mit einem passenden Template viel einfacher. In Windows Forms kann man die Inhalte zweier Textspalten einer DataTable verknüpfen, z.B. so:

    using System;
    using System.Data;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private Button btn = new Button() { Text = "Add", Dock = DockStyle.Top };
        private ComboBox cb = new ComboBox() { Dock = DockStyle.Top, DisplayMember = "Vollname" };
        private DataGridView dgv = new DataGridView() { Dock = DockStyle.Fill, ReadOnly = true, AllowUserToAddRows = false };
        private DataTable dt = new DataTable();
        private BindingSource bs = new BindingSource();
        private Random rnd = new Random();
        private void Form18_Load(object sender, EventArgs e)
        {
          this.Controls.AddRange(new Control[] { dgv, cb, btn });
          btn.Click += Btn_Click;
          GetData();
          bs.DataSource = dt;
          bs.Sort = "Nachname,Vorname";
          dgv.DataSource = bs;
          cb.DataSource = bs;
        }
    
        private void Btn_Click(object sender, EventArgs e)
        {
          var row = (DataRowView)bs.AddNew();
          row.Row["Number"] = rnd.Next(0, 1000);
          bs.EndEdit();
          bs.MovePrevious();
        }
    
        private void GetData()
        {
          var col = dt.Columns.Add("ID", typeof(int));
          col.AutoIncrement = true;
          col.AutoIncrementSeed = 1;
          col.AutoIncrementStep = 1;
          dt.Columns.Add("Nachname", typeof(string));
          dt.Columns.Add("Vorname", typeof(string));
          dt.Columns.Add("Vollname", typeof(string), "Vorname + ' ' + Nachname");
          for (int i = 1; i < 100; i++) dt.Rows.Add(i, $"Name {rnd.Next(1, 50)}", $"Vorname {rnd.Next(1, 1000)}");
        }
      }
    }


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 18. Juni 2020 04:10