我的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;
}
}
}
在calculate_click()
的for循环的最后一行中,每次循环运行到List<TableData>
对象Data
中时,我都会添加项目。在函数的最后,我将dataGrid.ItemsSource
分配为该列表。但是它所做的只是将标头添加到DataGrid
中,而不是其中的实际项目:
答案 0 :(得分:2)
List<>
不会自动或动态更新数据。
使用ObservableCollection<>
来实时更新DataGrid
。
阅读这些文档以获得进一步的帮助-
Binding to a collection of items
您的代码应如下所示-
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项目,然后复制这些代码进行测试。我相信它将成功。
要使用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应用程序时提高编程技能。