我想知道问题的最佳解决方法是什么。我需要为我的数据生成DataGrid。我的数据如下:
Competitor{
public string Name {get; set;}
public string Sname {get; set;}
public List<TimeSpan> Laps {get; set;}
}
名称和SName从开始就知道了。当竞争对手圈起来时,他会得到他的Lap TimeSpan。
因此,在5圈之后,DataGrid应该如下所示:
Name | SName | Lap1 | Lap2 | Lap3 | Lap4 | Lap5
asd | dsa | 1:1:1 | 1:2:1 | 1:0:1 | 1:2:2 | 1:3:1
bbb | cccc | 2:2:2 | 2:1:1 | 1:0:0 | 2:0:0 | 1:2:3
...
我检查了这种方法http://blogs.msmvps.com/deborahk/populating-a-datagrid-with-dynamic-columns-in-a-silverlight-application-using-mvvm/,但这并不是我所预期的。
知道如何完成这项工作吗? (任何其他人然后手动添加新的圆柱,它应自动添加)
答案 0 :(得分:2)
如果可以使用ListBox而不是DataGrid。你可以这样做:
**。XAML
<StackPanel>
<!--Header-->
<StackPanel Orientation="Horizontal" Margin="5 0 0 0">
<TextBlock Width="100" Text="Name"/>
<TextBlock Width="100" Text="Sname"/>
<ListBox x:Name="ListHeader" BorderThickness="0">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" Width="100"/>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</StackPanel>
<!--List of Competitors-->
<ListBox x:Name="Mylist">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Width="100" Text="{Binding Name}"/>
<TextBlock Width="100" Text="{Binding Sname}"/>
<ListBox ItemsSource="{Binding Laps}" BorderThickness="0">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" Width="100"/>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
**。CS
public MainWindow()
{
InitializeComponent();
List<Competitor> list = new List<Competitor>();
list.Add(new Competitor { Name = "Renee", Sname = "Lewallen", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30") } });
list.Add(new Competitor { Name = "Barney", Sname = "Fett", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30"), TimeSpan.Parse("00:40") } });
list.Add(new Competitor { Name = "Nelle", Sname = "Butterfield", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30"), TimeSpan.Parse("00:40"), TimeSpan.Parse("00:50") } });
list.Add(new Competitor { Name = "Marc", Sname = "Soriano", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20") } });
list.Add(new Competitor { Name = "Cathi", Sname = "Stumpff", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30") } });
list.Add(new Competitor { Name = "Jefferey", Sname = "Hunziker", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30") } });
list.Add(new Competitor { Name = "Berniece", Sname = "Courtney", Laps = new List<TimeSpan> { TimeSpan.Parse("00:10"), TimeSpan.Parse("00:20"), TimeSpan.Parse("00:30") } });
var LapsCounter = list.Select(w => w.Laps.Count).Max();
List<string> listH = new List<string>();
for (int i = 1; i <= LapsCounter; i++)
{
listH.Add("Lap" + i);
}
Mylist.ItemsSource = list;
ListHeader.ItemsSource = listH;
}
public class Competitor
{
public string Name { get; set; }
public string Sname { get; set; }
public List<TimeSpan> Laps { get; set; }
}
答案 1 :(得分:2)
为您的记录保留DataTable
。将此DataTable
与DataGrid's
AutogenerateColumns
绑定到true
。
将L List<Timespan>
更改为ObservableCollection<Timespan>
。
ObservableCollection
会在添加/删除项目时触发CollectionChanged
事件。
处理CollectionChanged
事件并通过添加更多列来更新DataTable
。
现在,我们需要刷新DataGrid
,否则它不会显示添加的额外列。它将显示添加的新行,但不会显示额外的列。所以,这样做:
Dgrid1.ItemsSource = null;
Dgrid1.ItemsSource = oldDataTable.DefaultView;