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

drkbr07n  于 2023-01-31  发布在  C#
关注(0)|答案(3)|浏览(167)

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

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

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

作为一个按钮的结果,我想改变路径。这是可能的吗?我改变了路径,但什么也没发生,我想是因为我需要再次调用构造函数,但按钮在不同的窗口,组合框在另一个窗口。

3vpjnl9f

3vpjnl9f1#

您可以创建一个方法,将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);
    }
xqnpmsa8

xqnpmsa82#

即使你已经选择了一个答案,正如john提到的,一个更好的方法是使用BindingList。在下面的代码中,一个自定义的BindingList被用来提供一个单一的方法来添加项目到当前数据中,从而保持代码的整洁。你可以使用一个标准的BindingList,对于第二次加载,使用一个foreach来附加数据。
有两个按钮,第一个从文本文件加载,然后第一次加载组合框,第二个按钮追加数据。两个按钮都使用硬编码文件名,你可以很容易地改变。
将以下代码放入项目的类文件中。
Source

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());
    }
}
eoigrqb6

eoigrqb63#

有一个比清除和添加项更小更简单的解决方案。你可以使用DataSource属性来代替这样做。但是你必须使用数组来代替列表。否则它将不起作用。你可以使用ReadAllLines(string)来代替ReadLines(string)
也请阅读此reference

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

private void populateCombo(string path)
{
    comboBox1.DataSource = System.IO.File.ReadAllLines(path);
}

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

相关问题