【解決方法】データではなく水平線のみをバインドするデータグリッド – C#を使用したWPF


こんにちは、みんな、

私はC#でデータをデータグリッドにバインドしようとしています.Datagridはxamlファイルで作成され、C#コードはデータをバインドしますが、結果のデバッグは適切ですが、水平線のみを表示するバインド後

私が試したこと:

//データグリッド – xaml.file

XAML
<DataGrid Name="dataGrid1" Margin="55,94,55,73"  AutoGenerateColumns="False">
</DataGrid>

/// xmal.cs ファイル

C#
private async void selected_RoiChange(object sender, System.EventArgs e)
{            
    List<roi> roiNumber = new List<roi>();                     
    await QueuedTask.Run(() => FillDataGrid());
}

private void FillDataGrid()
{
    var gdbPath = @"C:\Users\Admin\Documents\ArcGIS\Projects\CIM_Project\CIM_Project.gdb";
    //Row row;
    var dataGridSource = new DataTable();
    using (Geodatabase fileGeodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(gdbPath))))
    using (Table table = fileGeodatabase.OpenDataset("CIM_ROI_Table"))
    {
        var data = new ObservableCollection<dynamicdatarow>();
        //var dataGridSource = new DataTable();
        List<string> dtr = new List<string>();
        ObservableCollection<keyvaluepair<string, string="">> AttributeList = new ObservableCollection<keyvaluepair<string, string="">>() { };
        QueryFilter queryFilter = new QueryFilter { WhereClause = "ROI_Number = 'CE12021P27301'" };
        using (Selection selection = table.Select(queryFilter, SelectionType.ObjectID, SelectionOption.Normal))
        {
            IReadOnlyList<long> readOnlyList = selection.GetObjectIDs();
            using (RowCursor rc = table.Search())
            {
                RowCursor cursor = table.Search();
                IReadOnlyList<field> flds = cursor.GetFields();
                foreach (var fld in flds)
                {
                    if (fld.Name != "OBJECTID" && fld.Name != "Job_Status" && fld.Name != "Project_Name" && fld.Name != "Senior_Officer_Name" && fld.Name != "Contractor_Name" && fld.Name != "Voltage")
                    {
                        //Headers.Add(new ColumnData()
                        //{
                        //    Data = fld.Name,
                        //    Width = 100
                        //});
                        AddColumn<double>(dataGridSource, fld.Name.ToString());

                    }

                }
                var doubleGenerator = new Random();
                for (int rowIndex = 0; rowIndex < flds.Count; rowIndex++)
                {
                    var columnValues = new List<object>();
                    columnValues.Add(rowIndex < 1 ? "x" : "y");
                    for (int columnIndex = 0; columnIndex < dataGridSource.Columns.Count; columnIndex++)
                    {
                        columnValues.Add(doubleGenerator.NextDouble());
                    }
                    AddRow(dataGridSource, columnValues);
                }

            }
            Dispatcher.Invoke(
                new ThreadStart(() =>dataGrid1.ItemsSource = dataGridSource.DefaultView));

        }
    }

}

//And supported methods

private void AddColumn<tdata>(DataTable dataTable, string columnName, int columnIndex = -1)
{
    DataColumn newColumn = new DataColumn(columnName, typeof(TData));

    dataTable.Columns.Add(newColumn);
    if (columnIndex > -1)
    {
        newColumn.SetOrdinal(columnIndex);
    }

    int newColumnIndex = dataTable.Columns.IndexOf(newColumn);

    // Initialize existing rows with default value for the new column
    foreach (DataRow row in dataTable.Rows)
    {
        row[newColumnIndex] = default(TData);
    }
}

private void AddRow(DataTable dataTable, IList<object> columnValues)
{
    DataRow rowModelWithCurrentColumns = dataTable.NewRow();
    dataTable.Rows.Add(rowModelWithCurrentColumns);
}

解決策 1

見積もり:
C#
private void AddRow(DataTable dataTable, IList<object> columnValues)
{
    DataRow rowModelWithCurrentColumns = dataTable.NewRow();
    dataTable.Rows.Add(rowModelWithCurrentColumns);
}

あなたのコードは無視します columnValues パラメータを変更し、代わりに新しい完全に空白の行を追加します。

更新する必要があります rowModelWithCurrentColumns からの値で columnValues リストを作成するか、リストを配列に変換して DataRowCollection.Add[^] 新しい行の値を受け入れるオーバーロード。

C#
private void AddRow(DataTable dataTable, IList<object> columnValues)
{
    dataTable.Rows.Add(columnValues.ToArray());
}

解決策 2

WPFと DataGrid 使用する必要があるコントロール データ バインディング (参照: Microsoft Learn)[^].

使用時 Data Binding、データではなく直接作業します。 DataGrid 自体。 の DataGrid は「データのビュー」であるため、データに加えられた変更は自動的にビューに反映されます。 Data Binding すべての作業を行います。

ここにチュートリアルがあります DataBinding: WPF データ バインディングの概要 – 完全な WPF チュートリアル[^]

そして、ここにチュートリアルがあります DataGrid コントロール: DataGrid コントロール – 完全な WPF チュートリアル[^]

お役に立てれば!

コメント

タイトルとURLをコピーしました