如何将剩余天数绑定到 DataGrid 中?
How can I bind number of days left into a DataGrid?
我正在尝试解决一个问题,我需要计算截止日期前的天数。
我正在使用 LinqToSql、WPF。
在我的 Sql 中,我有一些日期(每个人一个,(类型日期)),例如代表某项付款的最后一天。
我的问题是,如何计算每个人的剩余天数,然后如何将它们绑定到我的 DataGrid?
这是我的XAML代码
<DataGrid Margin="58,0,0,160" Name="dgData" HorizontalAlignment="Left" Width="612" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Ime}"></DataGridTextColumn>
<DataGridTextColumn Header="Lastname" Binding="{Binding Prezime}"></DataGridTextColumn>
<DataGridTextColumn Header="Days left"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
这就是我填充 DataGrid 的方式
ProbaDataContext proba = new ProbaDataContext();
DateTime today = DateTime.Now;
int nmbDays;
public MainWindow()
{
InitializeComponent();
dgData.ItemsSource = proba.Radniks.ToList();
var sourceList = dgData.ItemsSource as List<Radnik>;
//this is the only thing i menaged to do, count all the days left
foreach(var item in sourceList)
{
DateTime datum = (DateTime)item.Datum;
nmbDays = (datum.Date - today.Date).Days;
txtDatum.Text = nmbDays.ToString();
}
}
您可以使用辅助子项 class 来填充数据网格并在那里进行计算:
private class AuxRadnik:Radnik
{
public int DaysLeft
{
get
{
return (this.Datum - DateTime.Now).Days;
}
}
}
然后更改您的代码以正确填充 de ItemSource:
public MainWindow()
{
InitializeComponent();
dgData.ItemsSource = proba.Radniks.Select(r=> new AuxRadnik
{Ime = r.Ime,
Prezime = r.Prezime,
Datum = r.Datum
}).ToList();
}
最后绑定 XAML 部分
<DataGrid Margin="58,0,0,160" Name="dgData" HorizontalAlignment="Left" Width="612" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Ime}"></DataGridTextColumn>
<DataGridTextColumn Header="Lastname" Binding="{Binding Prezime}"></DataGridTextColumn>
<DataGridTextColumn Header="Days left" Binding="{Binding DaysLeft}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
我找到了解决办法。
首先我必须确保我在 SQL 中输入的“Datum”是 DateTime(不是日期),
然后我不得不在我的数据库中再创建一个列(我将存储该天数的地方,我将其创建为 varchar 因为我想让它为负数),最后我执行了这些代码行:
dgData.ItemsSource = proba.Radniks.ToList();
var sourceList = dgData.ItemsSource as List<Radnik>;
for(int i=0;i<sourceList.Count;i++)
{
sourceList[i].BrojDana = (sourceList[i].Datum - DateTime.Now).Days.ToString();
}
我正在尝试解决一个问题,我需要计算截止日期前的天数。
我正在使用 LinqToSql、WPF。
在我的 Sql 中,我有一些日期(每个人一个,(类型日期)),例如代表某项付款的最后一天。
我的问题是,如何计算每个人的剩余天数,然后如何将它们绑定到我的 DataGrid?
这是我的XAML代码
<DataGrid Margin="58,0,0,160" Name="dgData" HorizontalAlignment="Left" Width="612" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Ime}"></DataGridTextColumn>
<DataGridTextColumn Header="Lastname" Binding="{Binding Prezime}"></DataGridTextColumn>
<DataGridTextColumn Header="Days left"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
这就是我填充 DataGrid 的方式
ProbaDataContext proba = new ProbaDataContext();
DateTime today = DateTime.Now;
int nmbDays;
public MainWindow()
{
InitializeComponent();
dgData.ItemsSource = proba.Radniks.ToList();
var sourceList = dgData.ItemsSource as List<Radnik>;
//this is the only thing i menaged to do, count all the days left
foreach(var item in sourceList)
{
DateTime datum = (DateTime)item.Datum;
nmbDays = (datum.Date - today.Date).Days;
txtDatum.Text = nmbDays.ToString();
}
}
您可以使用辅助子项 class 来填充数据网格并在那里进行计算:
private class AuxRadnik:Radnik
{
public int DaysLeft
{
get
{
return (this.Datum - DateTime.Now).Days;
}
}
}
然后更改您的代码以正确填充 de ItemSource:
public MainWindow()
{
InitializeComponent();
dgData.ItemsSource = proba.Radniks.Select(r=> new AuxRadnik
{Ime = r.Ime,
Prezime = r.Prezime,
Datum = r.Datum
}).ToList();
}
最后绑定 XAML 部分
<DataGrid Margin="58,0,0,160" Name="dgData" HorizontalAlignment="Left" Width="612" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Ime}"></DataGridTextColumn>
<DataGridTextColumn Header="Lastname" Binding="{Binding Prezime}"></DataGridTextColumn>
<DataGridTextColumn Header="Days left" Binding="{Binding DaysLeft}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
我找到了解决办法。
首先我必须确保我在 SQL 中输入的“Datum”是 DateTime(不是日期), 然后我不得不在我的数据库中再创建一个列(我将存储该天数的地方,我将其创建为 varchar 因为我想让它为负数),最后我执行了这些代码行:
dgData.ItemsSource = proba.Radniks.ToList();
var sourceList = dgData.ItemsSource as List<Radnik>;
for(int i=0;i<sourceList.Count;i++)
{
sourceList[i].BrojDana = (sourceList[i].Datum - DateTime.Now).Days.ToString();
}