0
votes

I've two listboxes. Each gets it's data from a SQLight query. User is able to make selections by dbl-click item and it should remove it fromn LB1 and place it in LB2. The user has option to remove from LB2 and it should move back to LB1 untill they are happy with selections. I'm using the saved data from LB2 to filter out any items found in LB1 (as per code). Once the user is happy with selected items LB2 data is saved back to DB. User has option of coming back to UI at any time and Add/Remove items as needed.

I'm using 2 x ObservableCollections to populate LB1 and LB2. Am using Template to control the layout of both LB's. I.E once the items gets to say 10 items in column it "spills" over into new column within LB.

I can get LB1 to populate correctly and even move items to LB2, but when I want to move it back again I get...

    "Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead."

I'm a novice at WPF C# and need explicit instructions on how to resolve this issue. (been working to resolve this for 4 weeks now). The solution needs to apply to both ListBoxes. Any help with this would be greatly appreciated.

Please review attached code and comment...

CS...

            using System;
            using System.Windows;
            using System.Windows.Input;
            using System.Windows.Controls;
            using System.Data;
            using System.Data.SQLite;
            using System.Collections;
            using System.Collections.ObjectModel;
            using System.Collections.Generic;
            using PTWS.Class_Lib;

            using System.ComponentModel;
            using System.Windows.Data;
            using System.Windows.Media;


            namespace PTWS.MainPanelControls.FormControls.Permits
            {
                /// <summary>
                /// Interaction logic for ColdWorkDraftUControl.xaml
                /// </summary>
                public partial class ColdWorkDraftUControl : UserControl
                {
                    PTWDatabase db = new PTWDatabase();

                    ObservableCollection<CertificateLookup> CertificateLookupList = new ObservableCollection<CertificateLookup>();
                    ObservableCollection<CertificateSelected> CertificateSelectedList = new ObservableCollection<CertificateSelected>();

                    public ColdWorkDraftUControl()
                    {
                        InitializeComponent();

                        LoadDataCertificateLookup();
                        // all works great untill I uncomment the next line
                        //LoadDataCertificateSelected();            
                    }

                    private void LoadDataCertificateLookup()
                    {
                        try
                        {
                            DataTable conditions;
                            String query = "select lc.Section \"Section\""
                                + ", lc.Description \"Description\""
                                + ", lc.SortOrder \"SortOrder\" "
                                + "from LookupConditions lc "
                                + "where not exists (select 1 from SelectedConditions sc where sc.Code = lc.Code and sc.PermitID = 'CWP-12-00001') "
                                + "and lc.Section = 'Certificates'";

                            conditions = db.GetDataTable(query);

                            foreach (DataRow r in conditions.Rows)
                            {
                                CertificateLookupList.Add(new CertificateLookup()
                                {
                                    Section = r["Section"].ToString(),
                                    Description = r["Description"].ToString(),
                                    SortOrder = r["SortOrder"].ToString()
                                });
                            }

                            listBoxCertificateLookup.ItemsSource = CertificateLookupList;
                        }
                        catch (Exception fail)
                        {
                            String error = "The following error has occurred:\n\n";
                            error += fail.Message.ToString() + "\n\n";
                            MessageBox.Show(error);
                        }
                    }

                    void LoadDataCertificateSelected()
                    {
                        try
                        {
                            DataTable conditions;
                            String query = "select Section \"Section\""
                                + ", Description \"Description\""
                                + ", SortOrder \"SortOrder\"";
                            query += "from SelectedConditions where PermitID = 'CWP-12-00001' and Section = 'Certificates'";
                            conditions = db.GetDataTable(query);



                            foreach (DataRow r in conditions.Rows)
                            {
                                CertificateSelectedList.Add(new CertificateSelected()
                                {
                                    selectedSection = r["Section"].ToString(),
                                    selectedDescription = r["Description"].ToString(),
                                    selectedSortOrder = r["SortOrder"].ToString()
                                });
                            }
                            listBoxCertificateSelected.DataContext = CertificateSelectedList;
                        }
                        catch (Exception fail)
                        {
                            String error = "The following error has occurred:\n\n";
                            error += fail.Message.ToString() + "\n\n";
                            MessageBox.Show(error);
                        }
                    }

                    private void listBoxCertificateLookup_MouseDoubleClick(object sender, MouseButtonEventArgs e)
                    {
                        try
                        {
                            ListBoxItem myListBoxItem =
                                (ListBoxItem)(listBoxCertificateLookup.ItemContainerGenerator.ContainerFromItem(listBoxCertificateLookup.Items.CurrentItem));
                            // listBoxCertificateSelected.DataContext = null;
                            listBoxCertificateSelected.Items.Add(myListBoxItem);
                        }
                        catch (Exception fail)
                        {
                            String error = "The following error has occurred:\n\n";
                            error += fail.Message.ToString() + "\n\n";
                            MessageBox.Show(error);
                        }
                    }

                    private void listBoxCertificateSelected_MouseDoubleClick(object sender, MouseButtonEventArgs e)
                    {
                        try
                        {
                            ListBoxItem myListBoxItem =
                                (ListBoxItem)(listBoxCertificateSelected.ItemContainerGenerator.ContainerFromItem(listBoxCertificateSelected.Items.CurrentItem));

                            //listBoxCertificateLookup.DataContext = null;
                            listBoxCertificateLookup.Items.Add(myListBoxItem);
                        }
                        catch (Exception fail)
                        {
                            String error = "The following error has occurred:\n\n";
                            error += fail.Message.ToString() + "\n\n";
                            MessageBox.Show(error);
                        }
                    }
                }
            }

XAML...

            <UserControl x:Class="PTWS.MainPanelControls.FormControls.Permits.ColdWorkDraftUControl"
                         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                         mc:Ignorable="d" 
                         d:DesignHeight="300" d:DesignWidth="300">

                <Grid>
                    <ListBox Name="listBoxCertificateLookup"
                             ItemsSource="{Binding CertificateSelectedList}"
                             MouseDoubleClick="listBoxCertificateLookup_MouseDoubleClick"
                             IsSynchronizedWithCurrentItem="True"
                             HorizontalAlignment="Left" Width="300" Height="75" VerticalAlignment="Top" >
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Height="23" Orientation="Horizontal">
                                    <TextBlock Text="{Binding Path=Description}" VerticalAlignment="Top" />
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <WrapPanel IsItemsHost="True" Orientation="Vertical" />
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>
                    </ListBox>

                    <ListBox Name="listBoxCertificateSelected"
                             ItemsSource="{Binding}"
                             MouseDoubleClick="listBoxCertificateSelected_MouseDoubleClick"
                             HorizontalAlignment="Left" Width="300" Height="75" VerticalAlignment="Top" Margin="0,153,0,0">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Height="23" Orientation="Horizontal">
                                    <TextBlock Name="textBlock" Text="{Binding Path=selectedDescription}" VerticalAlignment="Top" />
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <WrapPanel IsItemsHost="True" Orientation="Vertical" />
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>
                    </ListBox>
                </Grid>
            </UserControl> 

CLASS...

            using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Text;

            namespace PTWS.Class_Lib
            {
                class CertificateLookup
                {
                    public string Section { get; set; }
                    public string Description {get; set;}
                    public string SortOrder { get; set; }

                    public string selectedSection { get; set; }
                    public string selectedDescription { get; set; }
                    public string selectedSortOrder { get; set; }
                }
            }

AMENDED CS File mouseDoubleClick event (amended appropriately for both listboxes)...

            CertificateLookup myListBoxItem = (CertificateLookup)((ListBox)sender).SelectedItem;

                            CertificateSelectedList.Add(new CertificateSelected()
                            {
                                selectedDescription = myListBoxItem.Description
                            });

                            CertificateLookupList.Remove(myListBoxItem);
1

1 Answers

0
votes

Your problem is that you're adding items to the ListBox instead of adding and removing items to the collection the listbox is bound to.

Instead of doing: listBoxCertificateSelected.Items.Add(myListBoxItem);, you should be adding/removing from the CertificateSelectedList and the CertificateLookupList directly.