我的TextBox
有一些Button
es,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
而不是其中的实际项目:
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));
}
}
}
现在,标题甚至在单击之前出现,但数据仍未显示在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控件一样,DataGrid控件包含在Windows Community Toolkit中。 WindowsCommunityToolkit是GitHub上的开源软件。当您在使用此控件时遇到问题时,您可以检查其文档以查看您是否正在使用此控件执行正确的操作。您甚至可以下载整个WindowsCommunityToolkit项目以查看特定控件的源代码,以深入了解使用此控件。检查其源代码,您将知道控件如何工作。这是一种学习方法,可以帮助您在开发UWP应用程序时提高编程技能。