1

C#.NET4.5、MS Visual Studio 2012、WPF を使用。

こんにちは、null を与えるコードがいくつかあります。このコードは、私が試した以前のソリューションです。エラーは発生しませんでしたが、今日デバッグしたときに行がnullであることがわかったので、テストしたことはありません。

コードは次のとおりです。

最初に、SQL から収集したデータをデータテーブルにスローし、それをデータグリッドにスローしました...

 private void LoadPareto(string pg)
 {
     DataTable tbl = new DataTable();
     tbl = mysqlq.SQL_GetPareto(pg);
     paretogrid.ItemsSource = tbl.AsDataView();
     // InsertColumns();
     ShowArrows();
 }

XAML での 2 番目のセットアップ バインディング...

<DataGrid Name ="paretogrid" ItemsSource="{Binding}"

3番目に、Ienumerableを作成しました...

public IEnumerable<System.Windows.Controls.DataGridRow> GetDataGridRow(System.Windows.Controls.DataGrid grid)
{
    var itemsource = grid.ItemsSource as System.Collections.IEnumerable;
    if (null == itemsource) yield return null;
    foreach (var item in itemsource)
    {
        var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; // null?
        if (null != row) yield return row;
    }
}

次に、このメソッドで呼び出します...

private void ShowArrows()
{
    var rows = GetDataGridRow(paretogrid); // fetching null?

    foreach (DataGridRow r in rows)
    {
        DataRowView rv = (DataRowView)r.Item;
        foreach (DataGridColumn column in paretogrid.Columns)
        {
            if (column.GetCellContent(r) is TextBlock)
            {
                TextBlock cellcontent = column.GetCellContent(r) as TextBlock;
                MessageBox.Show(cellcontent.Text);
            }
        }
    }
}

今私が抱えている問題は Ienumerbale にあります。私のアイテム ソースには完璧な 12007 レコードが含まれていることがわかります。しかし、一歩踏み出すと...

var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;

私の「if」ステートメントがそれをfalseとして見つけたので、yieldをスキップするnullを返しています。もちろん、「showarrows」メソッドで foreach ループをステップ実行すると、null があるので気にしません。

それで、どこが間違っているのですか?私は何かを逃していますか?

よろしくお願いします!

4

1 に答える 1

2

DataGrid行を取得しているときにまだ更新されていません。解決策はparetogrid.UpdateLayout()、を設定した直後にすることですItemsSource

これは、データと UI コードを混在させるのはあまり良くないことに注意してください。あなたがやろうとしていることは、おそらく XAML で実行できたはずであり、この問題は発生しません。

于 2013-04-04T11:41:37.303 に答える