所以我使用List<List<String>>
作为我的数据类型来从日志文件填充数据网格。我已调试并检查数据是否实际输入到我的List<List<String>>
并且看起来是,但是当我将数据网格的ItemsSource
设置为List<List<String>>
时,我的数据网格得到了填充了正确的行数和列数,但是完全为空。
我的数据没有进入的任何想法?
string selection = DEFAULT_PATH + @"\" + listBox1.SelectedItem.ToString() + ".log";
string line;
//string[] gridValues = new string[8];
List<List<String>> myList = new List<List<String>>();
using (StreamReader sr = new StreamReader(selection))
{
while ((line = sr.ReadLine()) != null)
{
List<String> myTempList = new List<String>();
string[] lines = new string[8];
lines = line.Split('\t');
for (int i = 0; i < 8; i++)
{
myTempList.Add(lines[i]);
}
myList.Add(myTempList);
}
}
dataGrid1.ItemsSource = myList;
另外,这是xaml:
<DataGrid AutoGenerateColumns="True" Height="398" HorizontalAlignment="Left" Margin="281,0,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="268">
<DataGrid.Columns>
<DataGridTextColumn Header="TimeStamp" />
<DataGridTextColumn Header="Process" />
<DataGridTextColumn Header="TID" />
<DataGridTextColumn Header="Area" />
<DataGridTextColumn Header="Category" />
<DataGridTextColumn Header="EventID" />
<DataGridTextColumn Header="Level" />
<DataGridTextColumn Header="Message" />
<DataGridTextColumn Header="Correlation" />
</DataGrid.Columns>
</DataGrid>
答案 0 :(得分:1)
虽然可以使用IEnumerable作为ItemsSource成员,但是在其中嵌套另一个IEnumerable,表示每一行。 DataGrid不够“足够聪明”去查找每个嵌套成员中的每个值。
您是否可以构建一个表示文件中数据的类,每个列都成为公共属性?
public class YourClass {
public string Column1 {get;set;} // use more meaningful names, of course
public string Column2 {get;set;}
}
从文件中分配成员后,使用List<YourClass>
作为ItemsSource。
您可以使用C#快捷方式快速初始化公共成员:
var s = new YourClass() {Column1 = lines[0], Column2 = lines[1], ... };
答案 1 :(得分:0)
您要做的是创建一个类,其中包含与网格中每列相关的属性。然后在列的定义中将DataPropertyName设置为您的某个属性。
public class YourClass
{
public string Property1NameHere { get; set; }
public string Property2NameHere { get; set; }
}
List<YourClass> myList = new List<YourClass>();
using (StreamReader sr = new StreamReader(selection))
{
while ((line = sr.ReadLine()) != null)
{
...
YourClass yourClass = new YourClass() { ... };
myList.Add(yourClass);
}
}
dataGrid1.ItemsSource = myList;
答案 2 :(得分:0)
对dataGrid ItemSource属性的绑定是枚举外部List<T>
,其中包含的每个元素都是List<String>
。如果要绑定到List<List<String>>
,那么您将遇到一些问题。以下内容应该为您提供一个具有外部列表的Count和Capacity属性的数据网格:
<Grid>
<DataGrid x:Name="myGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</Grid>
后面的代码(不是代码的粉丝,但是对于这个简单的例子):
public MainWindow()
{
InitializeComponent();
List<List<String>> nestedList = new List<List<String>>();
for (int i = 0; i < 10; i++)
{
List<String> innerListElement = new List<string>();
for (int x = 0; x < 10; x++)
{
innerListElement.Add(String.Format("{0} - Element {1}", i, x));
}
nestedList.Add(innerListElement);
}
myGrid.ItemsSource = nestedList;
}
在此示例中没有一种干净的方法来处理数据绑定,因为每个内部List<T>
元素都没有一个好的引用名称。
您可以考虑绑定到List<KeyValuePair<String, List<String>>
或某种组合,为您提供内部引用,以便绑定路径可以引用。
答案 3 :(得分:0)
<DataGridTextColumn Header="TimeStamp" Binding="{Binding [0]}" />
<DataGridTextColumn Header="Process" Binding="{Binding [1]}" />
<DataGridTextColumn Header="TID" Binding="{Binding [2]}" />
<DataGridTextColumn Header="Area" Binding="{Binding [3]}" />
<DataGridTextColumn Header="Category" Binding="{Binding [4]}" />
<DataGridTextColumn Header="EventID" Binding="{Binding [5]}" />
<DataGridTextColumn Header="Level" Binding="{Binding [6]}" />
<DataGridTextColumn Header="Message" Binding="{Binding [7]}" />
<DataGridTextColumn Header="Correlation" Binding="{Binding [8]}" />
不是100%肯定,但我相信这会给你你想要的东西。