我可以在 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());
}
}
我有一个 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());
}
}