Почему Словарь всегда инициализируется заново? - PullRequest
0 голосов
/ 28 апреля 2019

Я получил форму и добавил кнопку ("add_source_button") для динамического создания новых кнопок на форме.Эти кнопки должны открывать FileDialogue.Пока это работает, окно для выбора файла отображается правильно.Мне нужно сохранить выбранные файлы в словаре «файлы», чтобы иметь доступ к значениям позже.Проблема в том, что словарь «файлы» всегда сбрасывается, когда я добавляю новый файл в словарь (возможно, потому что он вызывает форму, когда я нажимаю на кнопку выбора выбора файла).

Как у менячтобы адаптировать код для правильного хранения выбранных файлов в словаре «files»?

Пытался определить словарь файлов в отдельном классе, не работает

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 Ответ

3 голосов
/ 28 апреля 2019

Поскольку у вас разные формы с одним и тем же методом, лучшее, что вы можете сделать, это добавить интерфейс к формам, где вам нужен этот метод.Другой способ, предполагая, что реализация всегда одна и та же, что имеет смысл, - это расширить класс 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 #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...