Как исправить отправку данных из нового экземпляра формы в сетку данных в главной форме - PullRequest
1 голос
/ 02 апреля 2019

У меня был этот простой менеджер инвентаризации в WPF, использующий сетку данных, подключенный к таблице с помощью SQL, работающий на днях, но изменивший строку кода, и теперь он не работает.Я спал с тех пор, как сломал его, и не могу понять, как это исправить снова.

Проблема, похоже, связана с dataGrid1.Items.Add (testtables) из класса MainWindow ниже.

Я запустил его в trycatch с сообщением об исключении, в котором говорилось, что операция недопустима во время использования ItemsSource, и что для доступа к элементам и их изменения следует использовать ItemsControl.ItemsSource.

Вот коддля основной формы

namespace WpfApp2
{

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        DataClasses1DataContext dc = new DataClasses1DataContext(Properties.Settings.Default.TestingConnectionString);

        public MainWindow()
        {
            InitializeComponent();
            if (dc.DatabaseExists())
            {
                dataGrid1.ItemsSource = dc.TestTables;
            }
        }

        private void newButton_Click(object sender, RoutedEventArgs e)
        {
            Window1 window1 = new Window1();
            window1.Show();
        }

        public void NewLine (int ID, string nm, decimal pc)
        {
            TestTable testtable = new TestTable
            {
                ID = ID,
                Name = nm,
                Price = pc
            };

            dataGrid1.Items.Add(testtable);

        }

        private void saveButton_Click_1(object sender, RoutedEventArgs e)
        {
            dc.SubmitChanges();
        }

    }
}

XAML-код для MainWindow

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button x:Name="newBtn" Content="New" HorizontalAlignment="Left" Margin="217,62,0,0" VerticalAlignment="Top" Width="75" Click="newButton_Click"/>
        <Button x:Name="save" Content="Save" HorizontalAlignment="Left" Margin="401,82,0,0" VerticalAlignment="Top" Width="75" Click="saveButton_Click_1"/>
        <DataGrid x:Name="dataGrid1" HorizontalAlignment="Left" Height="100" Margin="77,236,0,0" VerticalAlignment="Top" Width="575" IsReadOnly="True"/>

    </Grid>
</Window>

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

public partial class Window1 : Window
    {
        public int iDNumber;
        public string name;
        public decimal price;

        public Window1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            iDNumber = Convert.ToInt32(iDTextBox.Text);
            name = Convert.ToString(nameTextBox.Text);
            price = Convert.ToDecimal(priceTextBox.Text);
            ((MainWindow)Application.Current.MainWindow).NewLine(iDNumber, name, price);
            this.Close();
        }
    }

XAML-код для Window1

<Window x:Class="WpfApp2.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="400">
    <Grid Margin="0,0,0,0">
        <Button Content="Save" HorizontalAlignment="Left" Margin="156,362,0,0" VerticalAlignment="Top" Width="76" Click="Button_Click"/>
        <TextBox x:Name="iDTextBox" HorizontalAlignment="Left" Height="23" Margin="156,79,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="nameTextBox" HorizontalAlignment="Left" Height="23" Margin="156,117,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="priceTextBox" HorizontalAlignment="Left" Height="23" Margin="156,155,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <Label Content="ID" HorizontalAlignment="Left" Margin="95,79,0,0" VerticalAlignment="Top"/>
        <Label Content="Name" HorizontalAlignment="Left" Margin="95,117,0,0" VerticalAlignment="Top"/>
        <Label Content="Price" HorizontalAlignment="Left" Margin="95,155,0,0" VerticalAlignment="Top"/>

    </Grid>
</Window>

Когда он работал на днях, он красиво добавил новую строку данных в базу данных SQL (однако автоматически не отображала обновленную информацию в приложении, но этоне проблема в данный момент).

1 Ответ

0 голосов
/ 03 апреля 2019

В этом разделе вашего кода:

  public MainWindow()
    {
        InitializeComponent();
        if (dc.DatabaseExists())
        {
            dataGrid1.ItemsSource = dc.TestTables;
        }
    }

Вы отображаете данные, присваивая datatable свойству datagrid.ItemsSource. Если вы сделаете это, вам нужно добавить элементы, изменив DataTable вместо DataGrid.

dataGrid1.Items.Add(testtable);

Итак, вместо того, что описано выше, попробуйте добавить тестируемый элемент в существующую коллекцию dc.TestTables

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