WPF数据网格未填充List <list <string>&gt; </list <string>

时间:2012-06-26 16:51:06

标签: c# visual-studio-2010

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

4 个答案:

答案 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], ... };

查看Object initalizers on MSDN

答案 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%肯定,但我相信这会给你你想要的东西。