使用 ListBox 的项作为源替换 TextBox 中的单词

Posted

技术标签:

【中文标题】使用 ListBox 的项作为源替换 TextBox 中的单词【英文标题】:Replace words in a TextBox using Items of a ListBox as the source 【发布时间】:2021-06-22 21:44:39 【问题描述】:

我想更改此 TextBox 中的文本:

使用这个 ListBox 作为要更改的单词:

应使用此处插入的文本更改单词:

我已经将单词拆分为 text[] 数组。 现在,例如,当我选择单词 who 并单击 Replace 按钮以将 who 替换为 hey 时:字符串 who are you 应更改为 hey are you。 但似乎我的代码不能正常工作,它一直显示原始文本而不是修改后的文本:

private void btnReplace_Click(object sender, EventArgs e)

    string replace = txtReplace.Text;
    string tempReplace = "";
    txtList = listBox1.SelectedItems.ToString();
    txtText.Text = "";

    for (int i = 0; i < text.Length; i++)
    
        if (text[i].ToLower() == txtList.ToLower())
        
            text[i] = replace;
        
        tempReplace += text[i] + " ";
    
    txtText.Text = tempReplace;

我的代码有什么问题?

【问题讨论】:

请编辑您的问题以缩小“我的代码无法正常工作”的含义。目前还不清楚这里出了什么问题。 请注意,listBox1.SelectedItems.ToString() 可能会返回 System.Windows.Forms.ListBox.SelectedObjectCollection 而不是值。也许你想要.SelectedItem.ToString()?我建议通过 Eric Lippert 的How to debug small programs 了解一下。 哦,我明白了,感谢您的方法完美运行 顺便说一句,你可以简单地做txtText.Text = txtText.Text.Replace(listBox1.SelectedItem.ToString(), replace);。不过,这与您当前的方法略有不同,因为如果您的字符串是“test goodbye test”,并且您将“good”替换为“bad”,您将得到“test badbye test”。使用您当前的方法,它不会取代“再见”中的“好”。因此,这种替代方法可能不是您想要的。 【参考方案1】:

由于您的控件绑定在一起,为了执行相同的任务,您实际上可以将它们绑定到一个公共数据源并使用数据更改通知来更新所有这些控件同一时间。

▶列出源TextBox中单词的ListBox和修改这些部分的TextBox可以使用相同的数据源来创建Binding。

▶ 提供单词列表的TextBox可以在数据变化时更新,使用Binding的Parse事件connect编辑部分文本到数据源的TextBox。 这只是其中一种可能的方式,使用这些工具可以生成更复杂的绑定。

数据源可以是包含源文本中所有单词的List&lt;strings&gt;。但是一个简单的List&lt;T&gt; 单独做不了多少,所以你可以将它附加到一个BindingSource:这个类可以提供数据更改通知(所以所有绑定到这个数据源的控件在informed数据更改)。

您可以在所有控件准备好完全支持数据绑定后设置绑定(Form.Load 事件可以做到)并在替换源文本时创建数据源(List&lt;string&gt;)。在视觉示例中,我为此使用了一个 Button,但它应该是源 TextBox 中的文本被另一个字符串替换的场合。 不要为此使用其TextChanged 事件

private List<string> parts = null;
private BindingSource partsSource = null;

private void SomeForm_Load(object sender, EventArgs e)

    partsSource = new BindingSource();
    partsSource.DataSource = typeof(List<string>);

    lstParts.DataSource = partsSource;

    var txtBinding = new Binding("Text", partsSource, "", false, DataSourceUpdateMode.OnPropertyChanged);

    txtBinding.Parse += (o, args) => 
        if (parts.Count == 0) return;
        parts[lstParts.SelectedIndex] = args.Value.ToString();
        txtSource.Text = string.Join(" ", parts);
    ;
    txtReplace.DataBindings.Add(txtBinding);


private void btnBind_Click(object sender, EventArgs e)

    parts = new List<string>(txtSource.Text.Split());
    partsSource.DataSource = parts;

视觉效果

→ 提供源文本的文本框命名为txtSource。 → 按钮是btnBind。 → 列表框被命名为lstParts。 → 用于编辑部件的文本框命名为txtReplace

【讨论】:

以上是关于使用 ListBox 的项作为源替换 TextBox 中的单词的主要内容,如果未能解决你的问题,请参考以下文章

2021-08-14 WPF控件专题 ListBox控件详解

UWP实现ListBox颜色相间显示

在C#如何实现从左边的listbox控件的内容移到右边的listbox控件

ASP.NET中,使用两个ListBox双击实现左右移动

如何为ListBox项提供有意义的名称

listbox demo