将项目从列表框移动到列表框 [英] Moving items from listbox to listbox

查看:77
本文介绍了将项目从列表框移动到列表框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到过很多文章,介绍如何将项目从一个列表框移动到另一个列表框。我已经将建议的代码应用到我的项目中,但是所有这些示例都否定了listbox1是数据绑定的事实AS列表框2由先前存储的数据填充,因为UI中有两个绑定的列表框。我已经尝试了ObservableCollections,ArrayList'和现在的Lists< t> ...都具有相同的最终结果。有任何关于如何执行此操作的建议,因为当应用示例代码时出现以下错误当ItemsSource正在使用时,操作无效。请使用ItemsControl.ItemsSource访问和修改元素。



PS。我也试图通过使用datatemplate将listbox2溢出到多个列中。



问候史蒂文



代码如下:



cs -

I''ve come across numerous articles describing how to move items from one listbox to another. I''ve applied suggested code to my project but all these examples negate the fact that listbox1 is databound AS WELL AS listbox2 being populated by previously stored data as in there are two bound listboxes in the UI. I''ve tried ObservableCollections, ArrayList''s and now Lists<t>... all with the same end result. Has anyone any advice on how to do this as I get the following error when example code is applied "Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead."

PS. Im also trying to have listbox2 spill over into multiple columns by use of datatemplate.

Regards Steven

Code as follows:

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();
        
        private ObservableCollection<CertificateLookup> CertificateLookupList = new ObservableCollection<CertificateLookup>();

        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);

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

                foreach (DataRow r in conditions.Rows)
                {
                    CertificateSelectedList.Add(new CertificateSelected()
                    {
                        selectedSection = r["Section"].ToString(),
                        selectedDescription = r["Description"].ToString(),
                        selectedSortOrder = r["SortOrder"].ToString()
                    });
                }
                listBoxCertificateSelected.ItemsSource = 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 -



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}"
                 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; }
    }
}





解决方案

修改后的CS文件。 ..MouseDoubleClick事件代码更改(相应地对LB2进行适当的更改)




Solution
AMENDED CS File...MouseDoubleClick event code changes (make appropriate changes to LB2 accordingly)

CertificateLookup myListBoxItem = (CertificateLookup)((ListBox)sender).SelectedItem;
 
CertificateSelectedList.Add(new CertificateSelected()
{
selectedDescription = myListBoxItem.Description
});
 
CertificateLookupList.Remove(myListBoxItem);

推荐答案

当ItemsSource为时,操作无效使用。使用ItemsControl.ItemsSource访问和修改元素。

听起来这是一个很好的建议。



添加您的商品为 ObservableCollection< T> myCollection; 并放置类似于:

"Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead."
That sounds like a good advice.

Add your items to an ObservableCollection<T> myCollection; and place something like:
<ListBox ItemsSource="{Binding Path=myCollection}" />



将列表绑定到列表框。您可以将相同的列表绑定到多个列表框。



您还可以查看 WPF中的DataBinding [ ^ ]



问候

Espen Harlinn


to bind the list to the listbox. You can bind the same list to multiple listboxes.

You can also have a look at DataBinding in WPF[^]

Regards
Espen Harlinn


根据修正后的问题...



Blachshma提供的解决方案(http://stackoverflow.com/questions/14108531/wpf-moving-items-from-one-listbox-to-another-and-back-again-and-getting-operatio)



您的问题是您正在向ListBox添加项目,而不是向列表框绑定的集合中添加和删除项目。



而不是:listBoxCertificateSelected.Items.Add(myListBoxItem);,你应该直接从CertificateSelectedList和CertificateLookupList中添加/删除...
As per amended question...

Solution provided by Blachshma (http://stackoverflow.com/questions/14108531/wpf-moving-items-from-one-listbox-to-another-and-back-again-and-getting-operatio)

"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...


这篇关于将项目从列表框移动到列表框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆