C # Windows Universal: невозможно динамически добавлять элементы в DataGrid - PullRequest
1 голос
/ 20 апреля 2019

У меня есть несколько предметов TextBox, Button и controls:DataGrid в моем MainPage.xaml. Когда я нажимаю кнопку, я хочу обновить DataGrid, но по неизвестным причинам он не работает.

Вот соответствующие части MainPage.xaml

<Button x:Name="calculateButton" Content="Calculate" HorizontalAlignment="Left" VerticalAlignment="Center" Click="calculate_click"/>
<!--Necessary TextBoxes above the Button-->
<controls:DataGrid x:Name="dataGrid">
</controls:DataGrid>

Вот соответствующие части файла MainPage.xaml.cs:

namespace New_Salary_Calculator
{
    public class TableData
    {
        public Double Basic { get; set; }
        public Double Fbp { get; set; }
        public Double Inh { get; set; }
        public Double Ars { get; set; }
        public Double Cur { get; set; }

        public TableData(Double basic, Double fbp, Double inh, Double ars, Double cur)
        {
            this.Basic = basic;
            this.Fbp = fbp;
            this.Inh = inh;
            this.Ars = ars;
            this.Cur = cur;
        }
    }

    public sealed partial class MainPage : Page
    {
        public List<TableData> Data;
        public MainPage()
        {
            this.InitializeComponent();
            Data = new List<TableData>();
        }

        private void calculate_click(object sender, RoutedEventArgs e)
        {
            int years = Convert.ToInt32(yearInput.Text) - 1;
            for (int i = 1; i <= years; ++i)
            {
                Double pow = Math.Pow(1.09, years);
                Double basic = Math.Round(Convert.ToDouble(basicInput.Text) * pow),
                    fbp = Math.Round(basic * Convert.ToDouble(fbpInput.Text) / 100),
                    pf = Math.Round(basic * Convert.ToDouble(pfInput.Text) / 100),
                    grat = Math.Round(basic * Convert.ToDouble(gratInput.Text) / 100);

                Double inh = Math.Floor(basic + fbp), ars = Math.Round(fbp + basic + pf + grat);

                Double rent = Math.Round(Convert.ToDouble(rentInput.Text) * 12),
                    food = Math.Round(Convert.ToDouble(foodInput.Text) * pow),
                    investments = Math.Round(Convert.ToDouble(investmentsInput.Text) * pow),
                    ins = 100000;

                Double cur = inh - rent - food - investments - ins;
                Data.Add(new TableData(basic, fbp, inh, ars, cur));
            }
            dataGrid.ItemsSource = Data;
        }
    }
}

Внутри последней строки цикла for calculate_click() я добавляю элементы каждый раз, когда цикл переходит в объект List<TableData> Data. В конце функции я назначаю dataGrid.ItemsSource в качестве этого списка. Но все, что он делает, это добавляет заголовки к DataGrid, а не к элементам внутри него:

Перед кликом: Before

после нажатия: After

Ответы [ 2 ]

2 голосов
/ 20 апреля 2019

List<> не обновляет данные автоматически или динамически.

Используйте ObservableCollection<> вместо этого, чтобы обновить DataGrid в реальном времени.

Прочтите эту документацию для получения дополнительной помощи -

Привязка к коллекции предметов

ObservableCollection Class

Ваш код должен выглядеть следующим образом -

    public sealed partial class MainPage : Page
    {
        private ObservableCollection<TableData> Data;
        public MainPage()
        {
            this.InitializeComponent();
            Data = new ObservableCollection<TableData>();
            dataGrid.ItemsSource = Data;
        }

        private void calculate_click(object sender, RoutedEventArgs e)
        {
            int years = Convert.ToInt32(yearInput.Text) - 1;
            for (int i = 1; i <= years; ++i)
            {
                double pow = Math.Pow(1.09, years);
                double basic = Math.Round(Convert.ToDouble(basicInput.Text) * pow),
                    fbp = Math.Round(basic * Convert.ToDouble(fbpInput.Text) / 100),
                    pf = Math.Round(basic * Convert.ToDouble(pfInput.Text) / 100),
                    grat = Math.Round(basic * Convert.ToDouble(gratInput.Text) / 100);

                double inh = Math.Floor(basic + fbp), ars = Math.Round(fbp + basic + pf + grat);

                double rent = Math.Round(Convert.ToDouble(rentInput.Text) * 12),
                    food = Math.Round(Convert.ToDouble(foodInput.Text) * pow),
                    investments = Math.Round(Convert.ToDouble(investmentsInput.Text) * pow),
                    ins = 100000;

                Double cur = inh - rent - food - investments - ins;
                Data.Add(new TableData(basic, fbp, inh, ars, cur));
            }
        }
    }
1 голос
/ 30 апреля 2019

теперь заголовки появляются еще до щелчка, но Данные по-прежнему не отображаются в DataGrid

На самом деле, ответ Махмудула Хасана объяснил все, что связано с вашим вопросом. Я также проверил его код, он работал на меня.

Если вы все еще не можете обновить данные в DataGrid при нажатии кнопки «Рассчитать», возможно, в вашем собственном коде есть и другие проблемы.

Согласно вашему скриншоту, я сделал простую страницу XAML, как показано ниже:

<StackPanel>
    <StackPanel>
        <TextBox x:Name="yearInput"></TextBox>
        <TextBox x:Name="basicInput"></TextBox>
        <TextBox x:Name="fbpInput"></TextBox>
        <TextBox x:Name="pfInput"></TextBox>
        <TextBox x:Name="gratInput"></TextBox>
        <TextBox x:Name="rentInput"></TextBox>
        <TextBox x:Name="foodInput"></TextBox>
        <TextBox x:Name="investmentsInput"></TextBox>
    </StackPanel>

    <Button x:Name="calculateButton" Content="Calculate" HorizontalAlignment="Left" VerticalAlignment="Center" Click="calculate_click" />
    <!--Necessary TextBoxes above the Button-->
    <controls:DataGrid x:Name="dataGrid">
    </controls:DataGrid>
</StackPanel>

И код c # такой же, как у Махмудула Хасана. Пожалуйста, создайте новый пустой проект UWP и скопируйте этот код для тестирования. Я верю, что это сработает.

enter image description here

Чтобы использовать DataGrid, вам также необходимо установить правильный пакет nuget. См. Как: добавить элемент управления DataGrid на страницу , чтобы проверить, правильно ли вы его установили.

Вы даже можете получить официальный пример кода GitHub .

После этого, если вы теперь можете успешно обновить данные в DataGrid. Затем, следующий шаг - понять, почему вам нужно использовать ObservableCollection класс. Вам необходимо внимательно прочитать документы в ответе Махмудула Хасана. Он объяснил все соответствующие вещи.

После того, как вы поймете всю вышеуказанную информацию, если вы новичок в UWP, я мог бы дать вам несколько советов по разработке приложения UWP. Как и при использовании элемента управления DataGrid, элемент управления DataGrid включен в Windows Community Toolkit . WindowsCommunityToolkit с открытым исходным кодом на GitHub . Когда вы сталкиваетесь с проблемой при использовании этого элемента управления, вы можете проверить его документ, чтобы убедиться, что вы делаете правильные вещи при использовании этого элемента управления. Вы даже можете загрузить весь проект WindowsCommunityToolkit, чтобы увидеть исходный код конкретного элемента управления, чтобы глубже понять его использование. Проверяя его исходный код, вы узнаете, как работает элемент управления. Это метод обучения, который может помочь вам улучшить свои навыки программирования при разработке приложения UWP.

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