[ad_1]
こんにちは、みんな、
私は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 チュートリアル[^]
お役に立てれば!
[ad_2]
コメント