Глюк WinForms ComboBox привязки данных

Самый простой способ - использовать полупрозрачный фоновый PNG-образ.

Вы можете использовать JavaScript, чтобы он работал в Internet Explorer 6, если вам нужно.

Я использую метод, описанный в Прозрачные PNG в Internet Explorer 6 .

Кроме этого,

вы можете подделать его с помощью two side-by-side sibling elements - сделать один полупрозрачный, затем absolutely position the other over the top?

50
задан Ijas Ameenudeen 20 January 2019 в 03:47
поделиться

2 ответа

Это имеет отношение, как привязка данных настраивается в dotnet платформе, особенно BindingContext. На высоком уровне это означает, что, если Вы не определили иначе, каждая форма и все средства управления формы совместно используют тот же BindingContext. Когда Вы установите DataSource, свойство эти ComboBox будет использовать BindingContext для получения ConcurrenyMangager, который обертывает список. Эти ConcurrenyManager отслеживает такие вещи как текущее выбранное положение в списке.

, Когда Вы устанавливаете DataSource из вторых ComboBox, это будет использовать тот же BindingContext (формы), который приведет к ссылке на тот же ConcurrencyManager как выше используемого для установки привязки данных.

Для получения более подробного объяснения см. BindingContext.

38
ответ дан Paul Fleming 7 November 2019 в 11:06
поделиться

Лучшее обходное решение (в зависимости от размера источника данных) должно объявить два BindingSource, объекты (новый с 2,00) связывают набор с теми и затем связывают тех с полями комбинированного списка.

я включаю полный пример.

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

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private BindingSource source1 = new BindingSource();
        private BindingSource source2 = new BindingSource();

        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1Load);
        }

        void Form1Load(object sender, EventArgs e)
        {
            List<string> myitems = new List<string>
            {
                "Item 1",
                "Item 2",
                "Item 3"
            };

            ComboBox box = new ComboBox();
            box.Bounds = new Rectangle(10, 10, 100, 50);
            source1.DataSource = myitems;
            box.DataSource = source1;

            ComboBox box2 = new ComboBox();
            box2.Bounds = new Rectangle(10, 80, 100, 50);
            source2.DataSource = myitems;
            box2.DataSource = source2;

            Controls.Add(box);
            Controls.Add(box2);
        }
    }
}

, Если Вы хотите смутить себя еще больше тогда, всегда пытаются объявить привязку в конструкторе. Это может привести к [приблизительно 112] действительно любопытные ошибки, следовательно я всегда связываю в событии Load.

21
ответ дан Paul Fleming 7 November 2019 в 11:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: