WPF передает данные из одного окна в другое - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть программа, в которую я загружаю данные из CSV и сохраняю их в список.Затем я загружаю их в список и в текстовые поля.Я создал кнопку «Новый», чтобы добавить новый элемент в список и показать новый элемент в списке и текстовых полях.Но каждый раз, когда я создаю новый элемент, я удаляю свой предыдущий список.Может ли кто-нибудь помочь мне, как добавить новый элемент и сохранить все мои данные?

Второе окно:

    public partial class New : Window
    {
    AddDataFromImport data = new AddDataFromImport();
    private string centName;
    private string centCode;
    private string centDesc;

    public New()
    {
        InitializeComponent();
    }

    private void BtnSave_Click(object sender, RoutedEventArgs e)
    {
        Validate();
        MainWindow mainWindow = new MainWindow(centName,centCode,centDesc);
        mainWindow.Show();
        this.Close();
    }
    }

Второе окно XML:

<Button x:Name="BtnSave" Content="Save" Grid.Row="5" Grid.Column="1" Width="150" Height="30" Click="BtnSave_Click"></Button>

Главное окно:

    public partial class MainWindow : Window
{
    public AddDataFromImport meetingData = new AddDataFromImport();
    private Centre selectedCentre = null;
    private Room selectedRoom = null;

    public MainWindow()
    {
        InitializeComponent();
    }

    public MainWindow(string nameNewCent, string codeNewCent, string descNewCent) : this()
    {
        Centre cent = new Centre(nameNewCent, codeNewCent, descNewCent);
        meetingData.MeetingCentres.Add(cent);
        ListOfCentres.ItemsSource = meetingData.MeetingCentres;
    }

    private void SelectCheck(object sender, EventArgs e)
    {
        MyCheckBox.IsChecked = true;
    }

    // Load import
    private void ImportData_Click(object sender, RoutedEventArgs e)
    {
        Microsoft.Win32.OpenFileDialog openFileDlg = new Microsoft.Win32.OpenFileDialog();
        Nullable<bool> result = openFileDlg.ShowDialog();
        if (result == true)
        {
            var filename = openFileDlg.FileName;
            meetingData.CreateDataStrucuturtes(filename);
            ListOfCentres.ItemsSource = meetingData.MeetingCentres;
        }
    }

    // Fill center columns
    public void ListOfCentres_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        selectedCentre = (Centre)ListOfCentres.SelectedItem;
        if (selectedCentre != null)
        {
            TBoxName.Text = selectedCentre.Name;
            TBoxCode.Text = selectedCentre.Code;
            TBoxDescription.Text = selectedCentre.Description;
        }
    }

    // Fill rooms from selected centre
    private void TBoxName_TextChanged(object sender, TextChangedEventArgs e)
    {
        if ((Centre)ListOfCentres.SelectedItem != null)
            ListOfRooms.ItemsSource = ((Centre)ListOfCentres.SelectedItem).RoomsInCentre;
    }

    // Create new centre
    private void BtnNew_Click(object sender, RoutedEventArgs e)
    {
        New newWindow = new New();
        newWindow.Show();
    }
    }

Главное окно XML:

    <StackPanel HorizontalAlignment="Left" Height="120" Margin="10,51,0,0" VerticalAlignment="Top" Width="340">
        <ListBox x:Name="ListOfCentres" DisplayMemberPath="CenterName" Height="119" HorizontalAlignment="Left" Width="340" ItemsSource="{Binding Path=Centres}" SelectionChanged="ListOfCentres_SelectionChanged"/>
    </StackPanel>

            <Button x:Name="BtnNew" Content="New" Width="70" Margin="0,5,0,0" Height="21" Click="BtnNew_Click"></Button>

WPF

1 Ответ

0 голосов
/ 19 ноября 2018

Редактировать: Я Настоятельно рекомендуем вам пойти и узнать больше об основах (не обязательно C #) программирования и прочитать о шаблоне проектирования MVVM, но если вы действительно хотитеделай так, я не остановлю тебя

Решение (хотя это может быть немного излишним) состоит в том, чтобы использовать метод Callback.По сути, мы даем Метод конструктору вашего окна New и выполняем эту функцию, когда мы хотим сохранить вновь созданное Centre

Ваше новое окно будет выглядеть так:

private Action<Centre> _callback;

public New(Action<Centre> callback)
{
    InitializeComponent();
    _callback = callback;
}

private void BtnSave_Click(object sender, RoutedEventArgs e)
{
    if (Validate());
    {
        callback(new Centre(centName, centCode, centDesc);
        this.Close();
    }
    else
        MessageBox.Show("Something didn't validate");
}

И ваш код MainWindow будет выглядеть примерно так:

private void AddNewCentre(Centre centre)
{
    meetingData.MeetingCentres.Add(centre);
}

private void BtnNew_Click(object sender, RoutedEventArgs e)
{
    New newWindow = new New(AddNewCentre);
    newWindow.Show();
}

Объяснение: С помощью delegates (как мы используем Action) вы можете передавать методы какпараметры.И здесь мы передаем метод, чтобы добавить новый Центр к вашему новому представлению.Как только мы закончим добавление нового Центра, мы Validate(); (я предполагаю, что это проверяет введенные данные и возвращает bool true / false, если данные верны), и если мы успешно делаем это, мы вызываем метод, который мы далив качестве параметра, который добавляет новый центр в список, а затем закрывает окно

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