我有一个表单,并添加了一个按钮(“ add_source_button”)以在表单上动态创建新按钮。这些按钮应该打开FileDialogue。到目前为止,该方法仍然有效,可以正确弹出文件选择窗口。我需要将所选文件存储在“文件”字典中,以便以后可以访问这些值。问题在于,当我向字典中添加新文件时,字典“文件”总是会重置(可能是因为当我单击“添加文件选择器”按钮时,它正在调用表单)。
如何修改代码以将所选文件正确存储在“文件”词典中?
试图在单独的类中定义文件Dictionary,这不起作用
Form1
int counter = 0;
Dictionary<string, string> files = new Dictionary<string, string>();
utilitys Utility = new utilitys();
public Form1 ()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
datasource1_location = datasource1.Location;
datasource1.Click += delegate { show_file_selector(datasource1.Name); };
}
private void add_source_Click(object sender, EventArgs e)
{
counter++;
datasource1_location.X += 50 + datasource1.Width;
Utility.add_element_to_form(this, 50, 50, "datasource"+counter.ToString(), "blabla");
}
public void show_file_selector (string source)
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Filter = "CSV-Files(*.csv)|*.csv";
if (fileDialog.ShowDialog()==DialogResult.OK)
{
files.Add(source, fileDialog.FileName);
}
}
实用程序:
public void add_element_to_form(Form form, Size size, Point location, String control_name, String text)
{
Form1 form1 = new Form1();
Button new_source = new Button();
new_source.Size = size;
new_source.Location = location;
new_source.Name = control_name;
new_source.Text = text;
new_source.Click += delegate { form1.show_file_selector(new_source.Name); };
form.Controls.Add(new_source);
}
我正在使用Form form
,因为我有不同的形式需要使用该方法。
答案 0 :(得分:3)
由于使用同一方法的表单不同,因此最好的办法是在需要该方法的表单中添加接口。假设实现总是相同的另一种方法(有意义)是使用另一个基类来扩展Form
类。
这是最后一种方法的基本思想:
public class FileSelectorBaseForm : Form
{
protected Dictionary<string, string> Files = new Dictionary<string, string>();
protected virtual void AddElementToForm(Size size, Point location, string controlName, string text)
{
Button newSource = new Button();
newSource.Size = size;
newSource.Location = location;
newSource.Name = controlName;
newSource.Text = text;
newSource.Click += delegate { ShowFileSelector(newSource.Name); };
Controls.Add(newSource);
}
protected virtual void ShowFileSelector(string source)
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Filter = "CSV-Files(*.csv)|*.csv";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
Files.Add(source, fileDialog.FileName);
}
}
}
然后将其用于Form1:
public class Form1 : FileSelectorBaseForm
请注意,我已经固定了要遵循c#约定的元素名称。