[ vujkev @ 23.02.2012. 00:17 ] @
Winforms aplikacija
Imam jednu listu, da kažemo stringova. Tu listu postavim kao datasource na combobox i listbox i sve radi super. Kako se šta menja u listi, promene su odmah vidljive na oba mesta. Zanima me kako rešiti problem da u combobox treba da se doda prazan element (kao da ništa nije selektovano), dok u listbox-u taj prazan element ne treba da postoji.

Code (csharp):

  private BindingList<string> list = new BindingList<string>();

        public Form1()
        {
            InitializeComponent();
            comboBox1.DataSource = list;
            listBox1.DataSource = list;
        }
       
        private void button1_Click(object sender, EventArgs e)
        {
            list.Add(Environment.TickCount.ToString());
        }

        private void button2_Click(object sender, EventArgs e)
        {
            list[0] = Environment.TickCount.ToString();
        }
 


postoji li neko jednostavno rešenje ili moram da pravim dve liste i da napravim neku sinhronizaciju među njima?

odmah da napomenem da comboBox1.items.insert ili add ili bilo šta zaboravite, jer je to nemoguće u WinForms aplikaciji kad se koristi datasource. Jedino "rešenje" koje sam do sad video je da se u listu doda "prazan" element (u ovom slučaju prazan string), ali onda se taj element vidi i u listbox-u što nije prihvatljivo.
[ vujkev @ 23.02.2012. 13:12 ] @
Pretpostavljam da jednostavnog rešenja nema čim se niko nije javio.

Imao sam malo vremena pa sam napravio svoju bind listu koja ima i taj prazan element
Code (csharp):

 class BindingListEx<T> : BindingList<T>
    {
        private readonly BindingList<T> listWithEmptyElement = new BindingList<T>();
        public BindingListEx(T emptyElement)
        {
            listWithEmptyElement.Add(emptyElement);
            this.ListChanged += new ListChangedEventHandler(BindingListEx_ListChanged);
            listWithEmptyElement.ListChanged += new ListChangedEventHandler(BindingListEx_ListChanged);
        }

        void BindingListEx_ListChanged(object sender, ListChangedEventArgs e)
        {
            bool changeInProgress;
            BindingList<T> sourceList = (BindingList<T>)sender;
            BindingList<T> destinationList;
            destinationList = sourceList == this ? listWithEmptyElement : this;

            lock (sourceList)
            {
                switch (e.ListChangedType)
                {
                    case ListChangedType.ItemAdded:
                        if (!destinationList.Contains((T)sourceList[e.NewIndex]))
                        {
                            destinationList.Add((T)sourceList[e.NewIndex]);
                        }
                        break;
                    case ListChangedType.ItemDeleted:
                        if (destinationList.Contains((T)sourceList[e.NewIndex]))
                        {
                            destinationList.RemoveAt(e.NewIndex);
                        }
                        break;
                    case ListChangedType.ItemChanged:
                        if (destinationList == listWithEmptyElement
                            && !object.ReferenceEquals( destinationList[e.NewIndex + 1] , sourceList[e.NewIndex]))
                            destinationList[e.NewIndex + 1] = sourceList[e.NewIndex];
                        else if (e.NewIndex > 0)
                            destinationList[e.NewIndex - 1] = sourceList [e.NewIndex];
                        break;
                }
            }
        }

        public BindingList<T> ListWithEmptyElement
        {
            get { return listWithEmptyElement; }
        }
}
 


koliko sam uspeo da proverim radi sasvim OK.