C#Windows Universal:无法将项目动态添加到DataGrid

时间:2019-04-20 12:57:46

标签: c# uwp datagrid windows-10-universal

我的TextBox中有几个Buttoncontrols: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;
        }
    }
}

calculate_click()的for循环的最后一行中,每次循环运行到List<TableData>对象Data中时,我都会添加项目。在函数的最后,我将dataGrid.ItemsSource分配为该列表。但是它所做的只是将标头添加到DataGrid中,而不是其中的实际项目:

点击之前: Before

点击后: After

2 个答案:

答案 0 :(得分: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 :(得分: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控件一样,Windows Community Toolkit中包含了DataGrid控件。 WindowsCommunityToolkit在GitHub上是开源的。当您在使用此控件时遇到问题时,可以检查其文档以查看您在使用此控件时是否做正确的事情。您甚至可以下载整个WindowsCommunityToolkit项目,以查看特定控件的源代码,从而对使用此控件有深入的了解。检查其源代码,您将了解控件的工作方式。这是一种学习方法,可以帮助您在开发UWP应用程序时提高编程技能。