为什么词典总是新初始化的?

时间:2019-04-28 13:32:36

标签: c# winforms

我有一个表单,并添加了一个按钮(“ 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,因为我有不同的形式需要使用该方法。

1 个答案:

答案 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#约定的元素名称。