none
C# WPF 在动态地给combobox控件添加项的过程中,如何避免重复添加相同的项? RRS feed

  • 问题

  • 动态地向combobox控件中添加有关camera的信息

     public class ItemContent
        {
            public string Name { get; set; }
            public string Url { get; set; }
            public string Streaming { get; set; }
            public int CameraId { get; set; }
            public string ServerRtspUrl { get; set; }
            public object Content { get; set; }
           
        }

     private void drop(object sender, DragEventArgs e)
            {

                 //添加item
                    ComboBoxItem item = new ComboBoxItem();
                    ItemContent ItemContent = new ItemContent();
                    item.Content = camera.Name;
                    mcWnd.cmBox.Items.Add(item);      

                    item.DataContext = ItemContent.CameraId;       

    }

    以上代码实现添加Item,也将CameraId与item进行了数据绑定。因为camera的Name可能是一样的,但是每个CameraId是唯一的,所以我想根据CameraId避免在下拉框中出现相同的item。

    例如:在下拉框中已经添加进去一个名字叫“一号摄像机”的item,当我再次添加“一号摄像机”时,就把之前的删掉,把这个新的加进去。求大神指教,这个怎么样用C#实现???

     

    2013年8月8日 1:59

答案

  • 这个有点复杂唉,我的想法是:

    item.DataContext = itemContent.CameraId;//将CameraId与item绑定,那么item里就有CameraId这个数据了
                    int id;
                    id = itemContent.CameraId;//定义个变量id,用它将CameraId取出来
                    if (id == “正要添加的CameraId”)//把将要添加进去的CameraId和取出来的CameraId进行比较
                    {
                        mcWnd.cmBox.Items.Remove(item);//如果相同就把原有的删掉
                    }
                    else
                    {
                        mcWnd.cmBox.Items.Add(item);不同就添加进去
                    }

    你看这样行不行得通?


    可以,还是用我的方法,我重写了Name比较,你直接调哟个List实体的Remove方法即可:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml.Linq;
    using System.IO;
     
    namespace ConsoleApplication2
    {
        public class ItemContent
        {
            public string Name { getset; }
            public string Url { getset; }
            public string Streaming { getset; }
            public int CameraId { getset; }
            public string ServerRtspUrl { getset; }
            public object Content { getset; }
     
            /// <summary>
            /// 重写比较器,作为List的IndexOf比较
            /// </summary>
            public override int GetHashCode()
            {
                return Name.GetHashCode();
            }
            /// <summary>
            /// 重写比较手段
            /// </summary>
            public override bool Equals(object obj)
            {
                ItemContent ic = obj as ItemContent;
                if (ic != null)
                {
                    return ic.Name == this.Name;
                }
                return false;
            }
        }
     
     
        class Program
        {
            static void AddNewItem(ItemContent ic, List<ItemContent> contents)
            {
                if (contents.IndexOf(ic) >= 0)
                {
                    ItemContent tic = contents.Find(p => p.Name == ic.Name);
                    contents.Remove(tic);
                }
                contents.Add(ic);
            }
            static void Main(string[] args)
            {
                List<ItemContent> contents = new List<ItemContent>();
                AddNewItem(new ItemContent { Name = "A", Url = "A" }, contents);
                AddNewItem(new ItemContent { Name = "A", Url = "B" }, contents);
                Console.WriteLine(contents.Count);
            }
        }
    }
    

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    • 已标记为答案 欣然 2013年8月13日 6:42
    2013年8月8日 5:57
    版主

全部回复

  • if(!mcWnd.cmBox.Items.Exist(o=> o.Content == camera.Name))  // 这句是伪码,只说明程序的功能,具体怎么实现,就看你用什么方式来实现了。

    {

       mcWnd.cmBox.Items.Add(item);      

                    item.DataContext = ItemContent.CameraId;  

    }

    2013年8月8日 2:09
  • 我要的是根据CameraId来判断,camera.Name是可以一样,这个不碍事,请高手详细的指导下!谢谢。膜拜!
    2013年8月8日 2:56
  • 我要的是根据CameraId来判断,camera.Name是可以一样,这个不碍事,请高手详细的指导下!谢谢。膜拜!

    List<ItemContent> dataSource = new List<ItemContent>();

    if(!dataSource .exist(o=>o.CameraId =  camera.CameraId ))

    {

    mcWnd.cmBox.Items.Add(item);      

                    item.DataContext = ItemContent.CameraId;  

    dataSource .add(camera);

    }

    2013年8月8日 3:12
  • 出现错误哎,List<ItemContent>不包含exist定义!

    有这个方法,不过Exist是大写的;另外可能需要你传入一个Lambda表达式作为结果:

    namespace ConsoleApplication2
    {
        public class ItemContent
        {
            public string Name { getset; }
            public string Url { getset; }
            public string Streaming { getset; }
            public int CameraId { getset; }
            public string ServerRtspUrl { getset; }
            public object Content { getset; }
     
        }
     
     
        class Program
        {
            static void AddNewItem(ItemContent ic,List<ItemContent> contents)
            {
                if (!contents.Exists(p => p.Name == ic.Name))
                {
                    contents.Add(ic);
                }
            }
            static void Main(string[] args)
            {
                List<ItemContent> contents = new List<ItemContent>();
                AddNewItem(new ItemContent { Name = "A", Url = "A" },contents);
                AddNewItem(new ItemContent { Name = "A", Url = "B" }, contents);
                Console.WriteLine(contents.Count);
            }
        }
    }
    2013年8月8日 4:31
  • 出现错误哎,List<ItemContent>不包含exist定义!

    我已经在上面说过了:
    // 这句是伪码,只说明程序的功能,具体怎么实现,就看你用什么方式来实现了。
    2013年8月8日 5:12
  • namespace ConsoleApplication2
    {
        public class ItemContent
        {
            public string Name { getset; }
            public string Url { getset; }
            public string Streaming { getset; }
            public int CameraId { getset; }
            public string ServerRtspUrl { getset; }
            public object Content { getset; }
     
            /// <summary>
            /// 重写比较器,作为List的IndexOf比较
            /// </summary>
            public override int GetHashCode()
            {
                return Name.GetHashCode();
            }
            /// <summary>
            /// 重写比较手段
            /// </summary>
            public override bool Equals(object obj)
            {
                ItemContent ic = obj as ItemContent;
                if (ic != null)
                {
                    return ic.Name == this.Name;
                }
                return false;
            }
        }
     
     
        class Program
        {
            static void AddNewItem(ItemContent ic,List<ItemContent> contents)
            {
                if (contents.IndexOf(ic)<0)
                {
                    contents.Add(ic);
                }
            }
            static void Main(string[] args)
            {
                List<ItemContent> contents = new List<ItemContent>();
                AddNewItem(new ItemContent { Name = "A", Url = "A" },contents);
                AddNewItem(new ItemContent { Name = "A", Url = "B" }, contents);
                Console.WriteLine(contents.Count);
            }
        }
    }

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年8月8日 5:24
    版主
  • 这个有点复杂唉,我的想法是:

    item.DataContext = itemContent.CameraId;//将CameraId与item绑定,那么item里就有CameraId这个数据了
                    int id;
                    id = itemContent.CameraId;//定义个变量id,用它将CameraId取出来
                    if (id == “正要添加的CameraId”)//把将要添加进去的CameraId和取出来的CameraId进行比较
                    {
                        mcWnd.cmBox.Items.Remove(item);//如果相同就把原有的删掉
                    }
                    else
                    {
                        mcWnd.cmBox.Items.Add(item);不同就添加进去
                    }

    你看这样行不行得通?


    • 已编辑 欣然 2013年8月8日 5:41
    2013年8月8日 5:35
  • 这个有点复杂唉,我的想法是:

    item.DataContext = itemContent.CameraId;//将CameraId与item绑定,那么item里就有CameraId这个数据了
                    int id;
                    id = itemContent.CameraId;//定义个变量id,用它将CameraId取出来
                    if (id == “正要添加的CameraId”)//把将要添加进去的CameraId和取出来的CameraId进行比较
                    {
                        mcWnd.cmBox.Items.Remove(item);//如果相同就把原有的删掉
                    }
                    else
                    {
                        mcWnd.cmBox.Items.Add(item);不同就添加进去
                    }

    你看这样行不行得通?

    复杂是因为你没用对WPF 绑定。

    http://www.cnblogs.com/khler/archive/2009/04/03/1428743.html

    WPF 中 ComboBox 的绑定方式。


    • 已编辑 Skyseer 2013年8月8日 5:42
    2013年8月8日 5:41
  • 这个有点复杂唉,我的想法是:

    item.DataContext = itemContent.CameraId;//将CameraId与item绑定,那么item里就有CameraId这个数据了
                    int id;
                    id = itemContent.CameraId;//定义个变量id,用它将CameraId取出来
                    if (id == “正要添加的CameraId”)//把将要添加进去的CameraId和取出来的CameraId进行比较
                    {
                        mcWnd.cmBox.Items.Remove(item);//如果相同就把原有的删掉
                    }
                    else
                    {
                        mcWnd.cmBox.Items.Add(item);不同就添加进去
                    }

    你看这样行不行得通?


    可以,还是用我的方法,我重写了Name比较,你直接调哟个List实体的Remove方法即可:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml.Linq;
    using System.IO;
     
    namespace ConsoleApplication2
    {
        public class ItemContent
        {
            public string Name { getset; }
            public string Url { getset; }
            public string Streaming { getset; }
            public int CameraId { getset; }
            public string ServerRtspUrl { getset; }
            public object Content { getset; }
     
            /// <summary>
            /// 重写比较器,作为List的IndexOf比较
            /// </summary>
            public override int GetHashCode()
            {
                return Name.GetHashCode();
            }
            /// <summary>
            /// 重写比较手段
            /// </summary>
            public override bool Equals(object obj)
            {
                ItemContent ic = obj as ItemContent;
                if (ic != null)
                {
                    return ic.Name == this.Name;
                }
                return false;
            }
        }
     
     
        class Program
        {
            static void AddNewItem(ItemContent ic, List<ItemContent> contents)
            {
                if (contents.IndexOf(ic) >= 0)
                {
                    ItemContent tic = contents.Find(p => p.Name == ic.Name);
                    contents.Remove(tic);
                }
                contents.Add(ic);
            }
            static void Main(string[] args)
            {
                List<ItemContent> contents = new List<ItemContent>();
                AddNewItem(new ItemContent { Name = "A", Url = "A" }, contents);
                AddNewItem(new ItemContent { Name = "A", Url = "B" }, contents);
                Console.WriteLine(contents.Count);
            }
        }
    }
    

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    • 已标记为答案 欣然 2013年8月13日 6:42
    2013年8月8日 5:57
    版主