我可以在 C# 运行时更改组合框项目吗?

Can i change combobox items in c# runtime?

我有一个 windows 表单应用程序和一个组合框,它是从一个 txt 文件中填充的。

        List<string> lines = System.IO.File.ReadLines(path).ToList();

        foreach (string l in lines)
        {
            combobox.Items.Add(l);
        }

作为一个按钮的结果,我想改变路径。可能吗?我更改了路径但没有任何反应,我想是因为我需要再次调用构造函数,但是按钮在不同的 window 中,组合框在另一个 window.

您可以创建一个方法,将您的 txt 文件的路径作为参数。然后,您可以在 Form_Load 和 Button_Click 上使用不同的路径调用该方法。

    private void Form1_Load(object sender, EventArgs e)
    {
        populateCombo(path);
    }

    private void populateCombo(string path)
    {
        comboBox1.Items.Clear();
        List<string> lines = System.IO.File.ReadLines(path).ToList();

        foreach (string line in lines)
        {
            comboBox1.Items.Add(line);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        populateCombo(differentPath);
    }

尽管您已经选择了答案,但正如 john 所提到的,更好的方法是使用 BindingList。在下面的代码中,自定义 BindingList 用于提供单一方法来将项目添加到当前数据,从而使您的代码保持整洁。您可以使用标准的 BindingList,对于第二次加载,使用 foreach 来附加数据。

有两个按钮,第一个从文本文件加载,然后第一次加载 ComboBox,第二个按钮附加到数据。两者都使用硬编码文件名,您可以轻松更改。

将以下内容放入项目的 class 文件中。

public class BindingListSpecial<I> : BindingList<I>
{
    private readonly List<I> _baseList;

    public BindingListSpecial() : this(new List<I>()) { }

    public BindingListSpecial(List<I> baseList) : base(baseList)
    {
        _baseList = baseList ?? throw new ArgumentNullException();
    }

    public void AddRange(IEnumerable<I> vals)
    {
        if (vals is ICollection<I> collection)
        {
            int requiredCapacity = Count + collection.Count;
            if (requiredCapacity > _baseList.Capacity)
                _baseList.Capacity = requiredCapacity;
        }

        bool restore = RaiseListChangedEvents;
        try
        {
            RaiseListChangedEvents = false;
            foreach (I v in vals)
                Add(v); // We cant call _baseList.Add, otherwise Events wont get hooked.
        }
        finally
        {
            RaiseListChangedEvents = restore;
            if (RaiseListChangedEvents)
                ResetBindings();
        }
    }
}

表单代码

public partial class Form1 : Form
{
    private BindingListSpecial<string> _bindingList;
    public Form1()
    {
        InitializeComponent();
    }

    private void LoadButton1_Click(object sender, EventArgs e)
    {
        _bindingList = new BindingListSpecial<string>(File.ReadAllLines("TextFile1.txt").ToList());
        comboBox1.DataSource = _bindingList;
    }
    private void LoadButton2_Click(object sender, EventArgs e)
    {
        _bindingList.AddRange(File.ReadAllLines("TextFile2.txt").ToList());
    }
}