解决 如何在组合框删除不需要的项目

e3xpic

成员
已加入
2020年12月30日
留言内容
11
编程经验
Beginner
Heloo是新手,也是编程新手

我想知道
单击button1时如何在组合框中删除不需要的项目

3.png


例如在这张照片中,我只想保留清单"good" word only

测试-好
测试-很好
测试还可以


如果我单击button1,它将是这样

44.png


谢谢您帮忙 :)
 
Solution
谢谢4乌拉圭回合的帮助,我想我已经解决了我的问题。谢谢大家的帮助。



C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
         
         

            StringBuilder sb = new StringBuilder();
            {
                foreach (var item in comboBox1.Items)
                 
                {
                    sb.Append(item.ToString() +...

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
并且请注意,它也不能区分单词和复合单词。所以这个词"goodbye" and "hardgoods"也有可能被发现。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
并且请注意,它也不能区分单词和复合单词。所以这个词"goodbye" and "hardgoods"也有可能被发现。

老实说,我不确定他到底想要什么,我只是想看看我是否可以写一些东西来删除包含一个单词的列表中的所有内容,这对于了解从索引中删除时的索引问题很有用。列表-以及如何更改索引。

这对我将来的项目可能很有用。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
实际上是在困扰我如何删除所有不包含的单词"Good",我尝试了几种变体!取反代码,但意识到这很简单:

C#:
return !s.Contains("Good");

从此列表:

Test1
好的2
好的4
Test3
Test5

只剩下Good2和Good4。

仍然不区分大小写,并且如上所述,只要单词中出现的任何单词都包含“ Good”,但感觉良好就可以实现目标。

作为可实现的目标。

C#:
private static bool Contains(String s)
        {
            string word = "Good";
            word = word.ToLower();
            return !s.Contains(word);
        }

将所选单词置于较低位置。



C#:
lowerCase = Filler.Select(x => x.ToLower()).ToList();

comboBox1.DataSource = lowerCase;

也将组合框放到小写字母。

仍然不知道这是否是OP所需要的,但是这是一个巧妙的小练习。
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
See the other variant of Contains():

它仍然不能解决您的子字符串问题,但至少可以解决区分大小写的问题。
 

e3xpic

成员
已加入
2020年12月30日
留言内容
11
编程经验
Beginner
谢谢大家,终于我得到了我想要的
但是代码不是很好,因为我尝试并错误地结合了多代码,checkedListBox,文本框,
在此代码中,我使用正则表达式




2.png



单击button1之后

3.png


C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (object item in comboBox1.Items)
            {
                checkedListBox1.Items.Add(item);
            }

            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                checkedListBox1.SetItemChecked(i, true);
            }

            StringBuilder sb = new StringBuilder();

            foreach (object checkedItem in checkedListBox1.CheckedItems)
            {
                {
                    sb.Append(checkedItem.ToString() + Environment.NewLine);
                }

                textBox1.Text = sb.ToString();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            comboBox2.Items.Clear();

       
            var regex = new Regex(@"[\n].*- test");

            var vv = textBox1.Text;
            MatchCollection matches = regex.Matches(vv);
            foreach (Match match in matches)
            {

                comboBox2.Items.Add(match);
            }
        }
    }
}


如果您全都帮忙解决它,我非常感谢。再次感谢。
对不起,您的小姐明白我的错。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
了解您实际要删除的数据类型以及其来源将很有用。

我在下面提供的代码实际上删除了"- test"在单个按钮中单击一个组合框。

但是,如果要删除的实际数据变化更大,则代码可能需要与上面编写的代码一样复杂。

代码:

C#:
List<string> myList = new List<string>();
        public Form1()
        {
            InitializeComponent();

            myList.Add("testing");
            myList.Add("testing");
            myList.Add("test-testing");
            myList.Add("test-test test");
            myList.Add("123 - test");
            myList.Add("ABC - test");
            myList.Add("random text - test");

            comboBox1.DataSource = myList;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            myList.RemoveAll(Contains);

            comboBox1.DataSource = null;
            comboBox1.DataSource = myList;
        }
        private static bool Contains(String s)
        {
                return !s.Contains("- test");
        }

结果:

启动组合框:

列出Full.jpg


按下按钮后:

清单Cut.jpg
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
@ e3xpic :您说过您想从组合框中删除项目,但是在您发布的文章#25中,您实际上是从文本框中删除项目。

使用UI进行数据存储确实不是一个好主意。
 

e3xpic

成员
已加入
2020年12月30日
留言内容
11
编程经验
Beginner
了解您实际要删除的数据类型以及其来源将很有用。

我在下面提供的代码实际上删除了"- test"在单个按钮中单击一个组合框。

但是,如果要删除的实际数据变化更大,则代码可能需要与上面编写的代码一样复杂。
如果您问我数据来自哪里,对不起,我无法告诉您更多信息,但是数据将来自随机名称,但是"- test "会一起放入combobox1.not我们或我通过手动添加,如您的代码(myList.Add("testing");) .
现在的问题是我没有找到直接从combobox1删除项目的代码,这就是为什么我将数据传输到textbox1的原因,因为textbox易于删除该数据。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
现在的问题是我找不到直接从combobox1删除项目的代码
问题就在这里。您正在尝试"find"代码,而不是自己为之迷惑并尝试"write" code.
 

e3xpic

成员
已加入
2020年12月30日
留言内容
11
编程经验
Beginner
我的更新代码我添加新的正则表达式代码

= var regex =新的Regex(@"[\n].*- test");


= var regex =新的Regex(@"(.*?- test*)");

支持很多文字




C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (object item in comboBox1.Items)
            {
                checkedListBox1.Items.Add(item);
            }

            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                checkedListBox1.SetItemChecked(i, true);
            }

            StringBuilder sb = new StringBuilder();

            foreach (object checkedItem in checkedListBox1.CheckedItems)
            {
                {
                    sb.Append(checkedItem.ToString() + Environment.NewLine);
                }

                textBox1.Text = sb.ToString();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            comboBox2.Items.Clear();

     
            var regex = new Regex(@"(.*?- test*)");

            var vv = textBox1.Text;
            MatchCollection matches = regex.Matches(vv);
            foreach (Match match in matches)
            {

                comboBox2.Items.Add(match);
            }
        }
    }
}
 
Last edited:

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
我的更新代码我添加新的正则表达式代码

= var regex =新的Regex(@"[\n].*- test");


= var regex =新的Regex(@"(.*?- test*)");

支持很多文字
我同意跳伞运动员的观点,即1,通过创建文本框和组合框将数据存储在UI中是个坏主意,而2,这并不是必须的。

从上面获取代码:

C#:
public void button1_Click(object sender, EventArgs e)
        {
            comboBox1.DataSource = null;

            var regex = new Regex(@"(.*?- test.*)");
          
            StringBuilder sb = new StringBuilder();
            foreach (string item in myList)
            {
                sb.Append(item + Environment.NewLine);
            }
            string tested = sb.ToString();
            MatchCollection matches = regex.Matches(tested);
            foreach (Match match in matches)
            {
                comboBox1.Items.Add(match);
            }
        }

在单个组合框中执行相同的操作。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
另外,让您了解。

当我问数据来自ComboBox1的来源时,我不是说工作,上学等。我的意思是:

1.文本文件;
2.清单;
3. SQL数据库;
4. Excel文件;
5.数据表;

目前,我的答案是基于列表填充的组合框...。但不知道您如何填充组合框,很难说该答案是否正确。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
我只是重新阅读了该线程,尽管尝试新代码很有趣,但我认为您早早就错过了建议 @jmcilhinney

查看您的申请步骤:

1.您收到数据。
2.您将数据放入组合框。

您这样做,它不会神奇地出现在组合框中,而是将其放入组合框中。

为什么没有3个步骤?

1.您收到数据。
2.您删除不需要的项目。
3.您将数据放入组合框。

然后,您有一个仅包含所需数据的组合框。
 

e3xpic

成员
已加入
2020年12月30日
留言内容
11
编程经验
Beginner
谢谢4乌拉圭回合的帮助,我想我已经解决了我的问题。谢谢大家的帮助。



C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
         
         

            StringBuilder sb = new StringBuilder();
            {
                foreach (var item in comboBox1.Items)
                 
                {
                    sb.Append(item.ToString() + Environment.NewLine);
                }
     
                var regex = new Regex(@"(.*?- test*)");
                string tested = sb.ToString();
                MatchCollection matches = regex.Matches(tested);
                foreach (Match match in matches)
                {


                    comboBox2.Items.Add(match);



                }

            }
        }


    }
    }

但是如果我使用单个组合框
会变成这样


Untitled.png
 
解决方案

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
我知道英语不是您的母语,但是无论如何您似乎都不会阅读所写内容或对所写内容进行回复时,英语确实很难为您提供帮助。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
我再也无法绕过这个线程了。不需要该StringBuilder。不需要第二个组合框。您可以直接过滤项目。请参见下面的代码:

C#:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace SimpleWinForms
{
    class TestForm : Form
    {
        public TestForm()
        {
            var flow = new FlowLayoutPanel()
            {
                FlowDirection = FlowDirection.TopDown,
                Dock = DockStyle.Fill,
                AutoSize = true,
            };

            SuspendLayout();
            flow.SuspendLayout();
            Controls.Add(flow);

            var comboBox = new ComboBox() { Width = 200 };
            flow.Controls.Add(comboBox);

            var btnPopulate = new Button() { Text = "Populate" };
            btnPopulate.Click += (o, e) => PopulateComboBox(comboBox);
            flow.Controls.Add(btnPopulate);

            var btnClean = new Button() { Text = "Clean" };
            btnClean.Click += (o, e) => CleanComboBox(comboBox);
            flow.Controls.Add(btnClean);

            flow.ResumeLayout(false);
            ResumeLayout(false);
        }

        Random _random = new Random();
        string[] _adjectives = { "large", "small", "glorious", "heavy", "light", "cursed" };
        string[] _colors = { "red", "orange", "yellow", "green", "blue", "indigo", "violet" };
        string[] _weapons = { "wand", "bow", "sword", "mace", "dagger", "hammer" };

        string GenerateRandomObject()
        {
            var adjective = _adjectives[_random.Next(_adjectives.Length)];
            var color = _colors[_random.Next(_colors.Length)];
            var weapon = _weapons[_random.Next(_weapons.Length)];

            return $"{adjective} {color} {weapon}";
        }

        string GenerateRandomTesSuffix()
            => _random.Next(100) > 50 ? " - test" : "";

        void PopulateComboBox(ComboBox cmb)
        {
            var count = _random.Next(10, 20);
            for (int i = 0; i < count; i++)
                cmb.Items.Add(GenerateRandomObject() + GenerateRandomTesSuffix());
        }

        bool AcceptItem(object item)
            => !item.ToString().EndsWith(" - test");

        List<object> GetItemsToRemove(ComboBox cmb)
        {
            var itemsToRemove = new List<object>();
            foreach(var item in cmb.Items)
            {
                if (!AcceptItem(item))
                    itemsToRemove.Add(item);
            }
            return itemsToRemove;
        }

        void CleanComboBox(ComboBox cmb)
        {
            foreach (var item in GetItemsToRemove(cmb))
                cmb.Items.Remove(item);
        }

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new TestForm());
        }
    }
}

GetItemsToRemove() returns a list of objects that should be removed from the combobox. What it does is iterate over the combobox items and calls 接受Item() 到 determine whether to keep the item or not. In my particular implementation, 接受Item() gets the string representation of the combobox item in question and checks to see if it ends with " - test". If it does, then it does not consider it acceptable. CleanComboBox() just takes the results of GetItemsToRemove()和removes them from the combo box items collection.

Obviously, the implementation of 接受Item() can be as simple or as sophisticated as you want it to be. It could be a regular expression. It could be a switch statement. It could be a really long complicated call that passes the object into some AI for acceptance or rejection.

无论如何,这使我们回到了OP在他最初的帖子中想要的:组合框中的数据被过滤到他可接受的值。
 
最佳 底部