1

所以我使用 aList<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>
4

4 回答 4

1

虽然确实可以为 ItemsSource 成员使用 IEnumerable,但您在其中嵌套了另一个 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], ... };

查看MSDN 上的 Object initalizers

于 2012-06-26T17:06:04.750 回答
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; 
于 2012-06-26T17:08:56.937 回答
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% 肯定,但我相信这会给你你正在寻找的东西。

于 2012-06-26T20:36:20.650 回答
0

与 dataGrid ItemSource 属性的绑定正在枚举List<T>包含的每个元素的外部是一个List<String>. 如果你想绑定到 aList<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>>或某个组合,从而为您提供内部引用,以便绑定路径可以引用。

于 2012-06-26T17:36:14.340 回答