我有一个Windows窗体设置,在完成后会在一个窗体上创建一个包含用户估算数据的.txt
文档,然后可以在另一个窗体上打开该窗体richTextBox
使用ComboBox
作为选择工具。
我遇到的问题是ComboBox
没有刷新创建新.txt
后保存.txt文档的目录列表,因此用户必须重新启动程序它出现在ComboBox
列表中,想知道如何解决这个问题。可能强制ComboBox
刷新按钮的列表onClick
?
使用ComboBox
选择方法的表单:
public Default()
{
InitializeComponent();
string[] files = Directory.GetFiles(@"C:\Modules");
foreach (string file in files)
ModuleSelectorComboBox.Items.Add(Path.GetFileNameWithoutExtension(file));
}
private void moduleToolStripMenuItem_Click(object sender, EventArgs e)
{
NewModule newmodule = new NewModule();
newmodule.Show();
}
private void ModuleSelectorComboBox_SelectedValueChanged(object sender, EventArgs e)
{
richTextBox1.Clear(); //Clears previous Modules Text
string fileName = (string)ModuleSelectorComboBox.SelectedItem;
string filePath = Path.Combine(@"C:\Modules\", fileName + ".txt");
if (File.Exists(filePath))
richTextBox1.AppendText(File.ReadAllText(filePath));
else
MessageBox.Show("There's been a problem. Please restart the program. \nError 1", "Error 1", //error 1 is file deleted while the program is running
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation,
MessageBoxDefaultButton.Button1);
}
要添加我想避免使用Dialog保存/打开文件方法,这就是我使用ComboBox执行此操作的原因。
提前致谢。
创建新.txt文档的表单(我不认为这本质上是需要的,我刚刚添加它以供参考):
private void button5_Click(object sender, EventArgs e)
{
RichTextBox newbox = new RichTextBox();
{
String Saved_Module = Path.Combine("C:\\Modules", txtModuleName.Text + ".txt");
newbox.AppendText(txtModuleName.Text + "\n" + ModuleDueDate.Text + "\n" + txtModuleInfo.Text + "\n" + txtModuleLO.Text);
newbox.SaveFile(Saved_Module, RichTextBoxStreamType.PlainText);
Directory.CreateDirectory(Path.Combine(@"C:\Modules", txtModuleName.Text));
this.Close();
}
}
答案 0 :(得分:0)
首先,将组合框群的逻辑封装在一个方法中。
public Default()
{
InitializeComponent();
LoadComboBox();
}
void LoadComboBox()
{
ModuleSelectorComboBox.Items.Clear();
string[] files = Directory.GetFiles(@"C:\Modules");
foreach (string file in files)
ModuleSelectorComboBox.Items.Add(Path.GetFileNameWithoutExtension(file));
}
我建议使用ShowDialog
方法打开表单作为对话框表单
并在DialogResult
方法中将DialogResult.OK
设置为button5_Click
。
private void button5_Click(object sender, EventArgs e)
{
RichTextBox newbox = new RichTextBox();
String Saved_Module = Path.Combine("C:\\Modules", txtModuleName.Text + ".txt");
newbox.AppendText(txtModuleName.Text + "\n" + ModuleDueDate.Text + "\n" + txtModuleInfo.Text + "\n" + txtModuleLO.Text);
newbox.SaveFile(Saved_Module, RichTextBoxStreamType.PlainText);
Directory.CreateDirectory(Path.Combine(@"C:\Modules", txtModuleName.Text));
this.DialogResult = DialogResult.OK;
this.Close();
}
然后,基于DialogResult
加载或不加载moduleToolStripMenuItem_Click
方法中的组合框项目。
private void moduleToolStripMenuItem_Click(object sender, EventArgs e)
{
NewModule newmodule = new NewModule();
newmodule.ShowDialog();
if (result == DialogResult.OK)
{
LoadComboBox();
}
}
更新
如果您不想使用对话框,可以订阅FormClosing
事件并在事件处理程序中更新组合框。
private void moduleToolStripMenuItem_Click(object sender, EventArgs e)
{
NewModule newmodule = new NewModule();
newmodule.FormClosing += F_FormClosing
newmodule.Show();
}
private void F_FormClosing(object sender, FormClosingEventArgs e)
{
LoadComboBox();
}
答案 1 :(得分:0)
我建议按照Valentin的建议打开LoadComboBox,但是使用FileSystemWatcher实例化并配置表单来监视Modules目录并在任何创建/删除时调用LoadComboBox。