1

そのため、データ型としてa を使用してList<List<String>>、ログ ファイルからデータ グリッドを作成しています。デバッグして、データが実際に適切に入力されていることを確認しましたが、データ グリッドをList<List<String>>データ グリッドに設定すると、データ グリッドに正しい数の行と列が入力されますが、完全に空です。ItemsSourceList<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 のオブジェクト初期化子を確認してください

于 2012-06-26T17:06:04.750 に答える
0

実行したいのは、グリッドの各列に関連するプロパティを持つクラスを作成することです。次に、列の定義で、DataPropertyNameをプロパティの1つに設定します。

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>ます。にバインドしたい場合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>>内部参照を提供する 1 つまたはいくつかの組み合わせにバインドすることを検討して、バインディング パスに参照するものを持たせることができます。

于 2012-06-26T17:36:14.340 に答える