C#Windows Universal:无法动态地向DataGrid添加项目

问题描述 投票:1回答:2

我的TextBox有一些Buttones,controls:DataGridMainPage.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;
        }
    }
}

calculate_click()的for循环的最后一行内,我每次循环都会添加项目到List<TableData>对象Data。在函数结束时,我将dataGrid.ItemsSource指定为此列表。但它只是将标题添加到DataGrid而不是其中的实际项目:

在点击之前:Before

点击后:After

c# uwp datagrid windows-10-universal
2个回答
2
投票

List<>不会自动或动态更新数据。

请使用ObservableCollection<>来更新你的DataGrid实时。

阅读这些文件以获得进一步的帮助 -

Binding to a collection of items

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
投票

现在,标题甚至在单击之前出现,但数据仍未显示在DataGrid中

实际上,Mahmudul Hasan的回复已经解释了与你的问题相关的所有事情。我也测试了他的代码,它确实适合我。

如果在单击“计算”按钮时仍无法更新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#代码与Mahmudul Hasan相同。请创建一个新的空白UWP项目并复制这些代码进行测试。我相信它会奏效。

enter image description here

要使用DataGrid,还需要安装正确的nuget包。请参阅How to: Add a DataGrid control to a page以检查您是否正确安装了它。

你甚至可以从GitHub获得官方代码样本。

之后,如果您现在可以成功更新DataGrid上的数据。然后,下一步是了解为什么需要使用ObservableCollection类。您需要仔细阅读Mahmudul Hasan的回复中的文件。它解释了所有相关的事情。

在您了解了上述所有信息后,如果您是UWP的初学者,我可以就开发UWP应用程序给您一些建议。就像您使用DataGrid控件一样,DataGrid控件包含在Windows Community Toolkit中。 WindowsCommunityToolkit是GitHub上的开源软件。当您在使用此控件时遇到问题时,您可以检查其文档以查看您是否正在使用此控件执行正确的操作。您甚至可以下载整个WindowsCommunityToolkit项目以查看特定控件的源代码,以深入了解使用此控件。检查其源代码,您将知道控件如何工作。这是一种学习方法,可以帮助您在开发UWP应用程序时提高编程技能。

© www.soinside.com 2019 - 2024. All rights reserved.