2

ネット 4 wpf c# プロジェクトでデータグリッド コントロールのバインディングに問題があります

これは私が持っているものです。

1.dgCSVData と呼ばれるデータグリッド コントロールで、列の自動生成がチェックされています。

私のxamlは

<DataGrid ItemsSource="{Binding dgCSVData}" Name="dgCSVData" Height="283" Width="1033" IsEnabled="True" ContextMenuService.ShowOnDisabled="True" IsReadOnly="True" SelectionChanged="dgCSVData_SelectionChanged" >
    <DataGrid.ContextMenu>
        <ContextMenu>
            <MenuItem Command="Copy">
                <!--<MenuItem.Icon>
                    <Image Source="Images/copy.png" />
                </MenuItem.Icon>-->
            </MenuItem>
        </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>
  1. csv をリストに読み込み、そのリストを使用して、SQL データベースから複製されたデータテーブルを作成しています。データテーブルはバックグラウンド リーダーで作成され、メイン スレッドに返されます。テーブルのデータ行の項目を循環させ、データテーブルが正しい情報で返されることを確認しました。これは、デバッグから出力されたテーブルの 1 つの行です。

年項目: 2013/14、項目から: 12/10/2013 00:00:00、項目へ: 18/10/2013 00:00:00、週番号項目: 27、時計番号項目: 1139、名前項目: SINGH,初期項目: R,部門項目: 1,自時間項目: 55.50,その他の時間項目: 0.00,総時間項目: 55.50,O/T プレミアム項目: 7.92

このコードでデータグリッドのコンテンツを設定します(または設定しようとします)

void objProgress_ValueChanged(DataTable Result,string msg)
{
    //Handle the event of csv datatable ready to return
    oTable = Result;

    //this is just for debug
    DataRow Dr = oTable.Rows[0];
    foreach (var item in Dr.ItemArray)
    {
        System.Windows.Forms.MessageBox.Show(item.ToString());
    }

    //this meant to set the binding BUT DOES NOT WORK TOTALLY LAST COLUMN MISSING
    this.dgCSVData.DataContext = oTable.DefaultView;
    this.dgCSVData.ItemsSource = oTable.DefaultView;
    tbLoadDgStat.Visibility = Visibility.Visible;

    //This does some error checking
    if (oTable.Rows.Count > 1)
    {
        if (msg.Trim().StartsWith("Warning"))
        {
            System.Windows.Media.Color c = Colors.Red;

            this.tbLoadDgStat.Background = new SolidColorBrush(c);
            System.Windows.Forms.MessageBox.Show(oTable.Rows.Count.ToString());
        }

        this.tbLoadDgStat.Text = msg;
        progressBar1.Value = 100;

        btUpload.IsEnabled = true;
    }
    else
    {
        this.tbdgImport.Text = "Error no data returned";
        progressBar1.Value = 50;
    }

    System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;

    progressBar1.Visibility = Visibility.Hidden;
    this.Show();
}

私が受け取るエラーは

System.Windows.Data エラー: 40: BindingExpression パス エラー: 'O' プロパティが 'object' ''DataRowView' (HashCode=30297615)' に見つかりません。BindingExpression :Path=O/T プレミアム; DataItem='DataRowView' (HashCode=30297615) ; ターゲット要素は 'TextBlock' (Name='') です。ターゲット プロパティは 'Text' (タイプ 'String') です

パス O/T Premium は、データテーブルとデータグリッドの両方の最後の列です。O/T プレミアム アイテムの値の上の行からのものである必要があります: 7.92データ テーブルから、これは小数ですが、正しくバインドされる前の 4 つのアイテムも同様です

開発の次の段階で別のcsvファイルをデータグリッドに読み込むことを期待しているため、バインディングを可能な限り汎用的にしようとしています

データ テーブルの他のすべての項目が正しく表示され、2 行のコードで実行されるため、バインディングの問題がわかりません。

 this.dgCSVData.DataContext = oTable.DefaultView;
        this.dgCSVData.ItemsSource = oTable.DefaultView;
4

2 に答える 2