【问题标题】:C# email address comboboxC# 电子邮件地址组合框
【发布时间】:2011-07-13 11:02:54
【问题描述】:

我有一个包含邮件收件人地址的组合框。当它被下拉时,用户会看到他曾经发送过邮件的所有地址的列表。我希望组合框在它的文本字段中附加地址,而不是替换那里的所有文本。

例如,我在组合框的列表中有一个电子邮件列表 aaa@mail.com、bbb@mail.com、ccc@mail.com,而 aaa@mail.com 在 combobox.Text 中。当我从 cbox 的列表中选择 bbb@mail.com 时,我想将 combobox.Text 变为“aaa@mail.com, bbb@mail.com”,但 Text 只是变为 bbb@mail.com。

这是组合框: +----------------+ +----------------+ | aaa@mail.com |V| | aaa@mail.com |V| +----------------+ +----------------+ | aaa@mail.com | | aaa@mail.com | | bbb@mail.com |试图选择这个带来| bbb@mail.com | | ccc@mail.com |这是不希望的| ccc@mail.com | +----------------+ +----------------+ 当有人点击 aaa@mail.com 或 bbb@mail.com 或 ccc@mail.com 时,可编辑字段变为该值。例如选择 bbb@mail.com 后会变成 +----------------+ | bbb@mail.com |V| +----------------+ 我希望组合框附加值而不仅仅是选择它们。所以我想让它显示 +------------------------------+ | aaa@mail.com, bbb@mail.com |V| +------------------------------+ 而不仅仅是 +----------------+ | bbb@mail.com |V| +----------------+

我写了这段代码(它只是一个带有组合框、按钮和按钮的表单,设置了表单的 FormClosed 事件,设置了按钮的 Click 事件并设置了组合框的事件 selectedIndexChanged 和 TextChanged),但它没有按我的预期工作。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        cboxFrom.Tag = string.IsNullOrEmpty(Settings.Default.emailFrom) ? "" : Settings.Default.emailFrom;
        cboxFrom.Text = (string)cboxFrom.Tag;
        if (Settings.Default.emailFroms == null)
            Settings.Default.emailFroms = new System.Collections.Specialized.StringCollection();
        //cboxFrom.DataSource = Settings.Default.emailFroms;
        foreach (string s in Settings.Default.emailFroms)
        cboxFrom.Items.Add(s);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        Settings.Default.Save();
    }

    private void cboxFrom_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            ComboBox cbox = (ComboBox)sender;
            string addr = (string)cbox.Items[cbox.SelectedIndex];
            if (addr != null && cbox.Tag != null && !(cbox.Tag as string).Contains(addr))
            {
                if (cbox.Text.Trim().Length == 0)
                    cbox.Text = addr;
                else
                    cbox.Text = cbox.Tag + ", " + addr;
                cbox.Tag = cbox.Text;
            }
            else
                cbox.Text = (string)cbox.Tag;
        }
        catch { }
    }

    private void cboxFrom_KeyPress(object sender, KeyPressEventArgs e)
    {
        ComboBox cbox = (ComboBox)sender;
        cbox.Tag = cbox.Text;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string[] addrs = cboxFrom.Text.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
        foreach(string s in addrs)
        if(!Settings.Default.emailFroms.Contains(s.Trim()))
            Settings.Default.emailFroms.Add(s);
    }
}

【问题讨论】:

  • 我不知道你想达到什么目的,看起来很荒谬
  • 我想在组合框中的可编辑字段中添加地址而不是替换它们。有可能吗?
  • 为什么不将它们附加到文本框之类的不同控件上,因为这会混淆 bb@mail.com 会发生什么,它会从列表中消失还是在单击时再次附加.无论如何,这不是组合框的使用方式
  • 我发现截取组合框比制作 ASCII 版本更容易。

标签: c# winforms combobox


【解决方案1】:

我只是在这里有一个建议。

而不是附加您的组合框文本。为什么不添加一个文本框和另一个按钮,单击时将组合框中的选定电子邮件地址添加到文本框?附加 textBox.Text 属性会更简单,并且它还允许用户在将其添加到发送列表之前确保他选择了正确的电子邮件。

按照我的理解,有很多电子邮件,向下滚动用户可能会做出错误的选择,然后它会自动添加到用户无法退出的 comboBox.Text 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-23
    • 2019-08-04
    • 2012-04-08
    • 2013-03-25
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多