ComboBox aktualisiert die Anzeigeliste nur, wenn Sie zuerst die Auswahl ändern.

Update: Ich habe die Antwort überprüft, bevor ich sie vollständig getestet habe. Es funktioniert immer noch nicht. Ich habe den folgenden Code aktualisiert, damit Sie ihn nur in ein leeres WinForms-Projekt einfügen und kompilieren können.

UPDATE: Ich habe festgestellt, dass sich das ausgewählte Element in der ComboBox jetzt wie erwartet verhält, wenn es in ein anderes Element geändert wird (in meinem Code unten würde ich von test1 zu test2 wechseln). Da ich noch keine Antworten erhalten habe, ändere ich die Frage auf diese.

Warum muss ich zu einem anderen Element im Kombinationsfeld wechseln, bevor die Änderungen angezeigt werden, die ich an der zugrunde liegenden Datenquelle vorgenommen habe?

Hier ist ein kurzer Testfall, was passiert.

Veränderungtest1 zutest1asdf text in txtBrokenKlicke an, um die Änderung zu bestätigen Text im Kombinationsfeld wird nicht aktualisiert.Change combo box to test2Veränderungtest2 zutest2asdf text in txtBrokenKlicke an, um die Änderung zu bestätigentext im Kombinationsfeld zeigt sofort an, dass 'test2asdf' immer noch @ anzeitest1 für das erste Element in der Dropdown-Listeänderntest1 Kombinationsfeld zeigttest1 Textfeld zeigttest1asdfupdate Textfeld auftest1asdm Kombinationsfeld wird sofort @ angezeigtest1asd

Ander als hinter den Kulissen das ausgewählte Element beim Laden zu ändern und es zurück zu ändern (dies scheint ein solcher Hack zu sein), wie kann ich das beheben?

Ich habe ein Kombinationsfeld, das an ein @ gebunden isBindingSource an ein @ gebundList<Holder> es hatHolder.Name als Anzeigewert. Ich habe auch ein Textfeld an @ gebundHolder.Name aber wenn ich den Text im Textfeld ändere, ändert sich nicht, was im Kombinationsfeld angezeigt wird. Durch Ändern ausgewählter Elemente und Zurücksetzen wird der aktualisierte Text im Textfeld angezeigt, der alte Wert wird jedoch weiterhin im Kombinationsfeld angezeigt. Wie kann ich das Element im Kombinationsfeld aktualisieren?

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace Sandbox_Form
{
    public class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            lstBroken = new BindingList<Holder>();
            lstBroken.Add(new Holder("test1"));
            lstBroken.Add(new Holder("test2"));
            bsBroken = new BindingSource(lstBroken, null);
            cmbBroken.DataSource = bsBroken;
            cmbBroken.DisplayMember = "Name";
            cmbBroken.SelectedIndex = 0;
            txtBroken.DataBindings.Add("Text", bsBroken, "Name");
            txtBroken.TextChanged += new EventHandler(txtBroken_TextChanged);

        }

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        void txtBroken_TextChanged(object sender, EventArgs e)
        {
            ((Control)sender).FindForm().Validate();
        }
        private BindingSource bsBroken;
        private BindingList<Holder> lstBroken;
        private ComboBox cmbBroken;
        private TextBox txtBroken;
        private Label label1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.cmbBroken = new System.Windows.Forms.ComboBox();
            this.txtBroken = new System.Windows.Forms.TextBox();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // cmbBroken
            // 
            this.cmbBroken.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.cmbBroken.FormattingEnabled = true;
            this.cmbBroken.Location = new System.Drawing.Point(12, 32);
            this.cmbBroken.Name = "cmbBroken";
            this.cmbBroken.Size = new System.Drawing.Size(94, 21);
            this.cmbBroken.TabIndex = 0;
            // 
            // txtBroken
            // 
            this.txtBroken.Location = new System.Drawing.Point(13, 60);
            this.txtBroken.Name = "txtBroken";
            this.txtBroken.Size = new System.Drawing.Size(93, 20);
            this.txtBroken.TabIndex = 1;
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(13, 13);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(41, 13);
            this.label1.TabIndex = 2;
            this.label1.Text = "Broken";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.txtBroken);
            this.Controls.Add(this.cmbBroken);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private void cmbWorks_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
    public class Holder
    {
        public Holder(string name)
        {
            Name = name;
        }
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set
            {
                _Name = value;
            }
        }
    }
}

Wenn ich an ein @ binList<String> stattdessen mitHolder.Name es funktioniert wie erwartet (dies ist nur ein einfaches Modell, die reale Klasse hat mehr als nur einen Namen, sodass eine Liste von Zeichenfolgen nicht funktioniert). Ich denke, das ist ein Hinweis darauf, was falsch ist, aber ich weiß nicht, was es ist. Die Verwendung eines Observable anstelle einer Liste macht keinen Unterschied.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage