프로그래밍 방식으로 WPF Datagrid에 열 및 행 추가
WPF를 처음 사용합니다. WPF의 DataGrid에 프로그래밍 방식으로 열과 행을 추가하는 방법을 알고 싶습니다. 우리가 Windows 양식에서 사용했던 방식입니다. 테이블 열과 행을 만들고 DataGrid에 바인딩합니다.
WPF DataGrid는 ASP.net 및 Windows 양식에서 사용되는 것과 약간 다르다고 생각합니다 (내가 틀렸다면 수정).
사용자가 셀의 데이터를 편집 할 수 있도록 DataGrid에 그리는 데 필요한 행과 열이 있습니다.
프로그래밍 방식으로 행을 추가하려면 :
DataGrid.Items.Add(new DataItem());
프로그래밍 방식으로 열을 추가하려면 :
DataGridTextColumn textColumn = new DataGridTextColumn();
textColumn.Header = "First Name";
textColumn.Binding = new Binding("FirstName");
dataGrid.Columns.Add(textColumn);
자세한 내용은 WPF DataGrid 토론 게시판 에서이 게시물 을 확인 하십시오.
이것을 시도하면 100 % 작동합니다. 프로그램 적으로 열과 행을 추가합니다. 처음에는 항목 클래스를 만들어야합니다.
public class Item
{
public int Num { get; set; }
public string Start { get; set; }
public string Finich { get; set; }
}
private void generate_columns()
{
DataGridTextColumn c1 = new DataGridTextColumn();
c1.Header = "Num";
c1.Binding = new Binding("Num");
c1.Width = 110;
dataGrid1.Columns.Add(c1);
DataGridTextColumn c2 = new DataGridTextColumn();
c2.Header = "Start";
c2.Width = 110;
c2.Binding = new Binding("Start");
dataGrid1.Columns.Add(c2);
DataGridTextColumn c3 = new DataGridTextColumn();
c3.Header = "Finich";
c3.Width = 110;
c3.Binding = new Binding("Finich");
dataGrid1.Columns.Add(c3);
dataGrid1.Items.Add(new Item() { Num = 1, Start = "2012, 8, 15", Finich = "2012, 9, 15" });
dataGrid1.Items.Add(new Item() { Num = 2, Start = "2012, 12, 15", Finich = "2013, 2, 1" });
dataGrid1.Items.Add(new Item() { Num = 3, Start = "2012, 8, 1", Finich = "2012, 11, 15" });
}
나는 같은 문제가 있었다. WPF에 새 행을 추가 DataGrid
하려면 트릭이 필요합니다. DataGrid
항목 개체의 속성 필드에 의존합니다. ExpandoObject
새 속성을 동적으로 추가 할 수 있습니다. 아래 코드는이를 수행하는 방법을 설명합니다.
// using System.Dynamic;
DataGrid dataGrid;
string[] labels = new string[] { "Column 0", "Column 1", "Column 2" };
foreach (string label in labels)
{
DataGridTextColumn column = new DataGridTextColumn();
column.Header = label;
column.Binding = new Binding(label.Replace(' ', '_'));
dataGrid.Columns.Add(column);
}
int[] values = new int[] { 0, 1, 2 };
dynamic row = new ExpandoObject();
for (int i = 0; i < labels.Length; i++)
((IDictionary<String, Object>)row)[labels[i].Replace(' ', '_')] = values[i];
dataGrid.Items.Add(row);
//편집하다:
이것은 구성 요소를 사용하는 방법이 아니지만 프로그래밍 방식으로 생성 된 데이터 (예 : 내 경우에는 일련의 기능과 신경망 출력) 만있는 경우 많은 것을 단순화합니다.
런타임에 열을 추가하고 DataTable
.
안타깝게도 47 개의 열이 이렇게 정의 되었기 때문에 데이터에 충분히 빠르게 바인딩되지 않습니다. 어떤 제안?
xaml
<DataGrid
Name="dataGrid"
AutoGenerateColumns="False"
ItemsSource="{Binding}">
</DataGrid>
System.Windows.Data를 사용하는 xaml.cs ;
if (table != null) // table is a DataTable
{
foreach (DataColumn col in table.Columns)
{
dataGrid.Columns.Add(
new DataGridTextColumn
{
Header = col.ColumnName,
Binding = new Binding(string.Format("[{0}]", col.ColumnName))
});
}
dataGrid.DataContext = table;
}
edit: sorry, I no longer have the code mentioned below. It was a neat solution, although complex.
I posted a sample project describing how to use PropertyDescriptor and lambda delegates with dynamic ObservableCollection and DynamicObject to populate a grid with strongly-typed column definitions.
Columns can be added/removed at runtime dynamically. If your data is not a object with known type, you could create a data structure that would enable access by any number of columns and specify a PropertyDescriptor for each "column".
For example:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
You can define columns this way:
var descriptors= new List<PropertyDescriptor>();
//retrieve column name from preprepared list or retrieve from one of the items in dictionary
foreach(var columnName in ColumnNames)
descriptors.Add(new DynamicPropertyDescriptor<Dictionary, string>(ColumnName, x => x[columnName]))
MyItemsCollection = new DynamicDataGridSource(Rows, descriptors)
Or even better, in case of some real objects
public class User
{
public string FirstName { get; set; }
public string LastName{ get; set; }
...
}
You can specify columns strongly typed (related to your data model):
var propertyDescriptors = new List<PropertyDescriptor>
{
new DynamicPropertyDescriptor<User, string>("First name", x => x.FirstName ),
new DynamicPropertyDescriptor<User, string>("Last name", x => x.LastName ),
...
}
var users = retrieve some users
Users = new DynamicDataGridSource<User>(users, propertyDescriptors, PropertyChangedListeningMode.Handler);
Then you just bind to Users collections and columns are autogenerated as you speficy them. Strings passed to property descriptors are names for column headers. At runtime you can add more PropertyDescriptors to 'Users' add another column to the grid.
If you already have the databinding in place John Myczek answer is complete.
If not you have at least 2 options I know of if you want to specify the source of your data. (However I am not sure whether or not this is in line with most guidelines, like MVVM)
option 1: like JohnB said. But I think you should use your own defined collection instead of a weakly typed DataTable (no offense, but you can't tell from the code what each column represents)
xaml.cs
DataContext = myCollection;
//myCollection is a `ICollection<YourType>` preferably
`ObservableCollection<YourType>
- option 2) Declare the name of the Datagrid in xaml
<WpfToolkit:DataGrid Name=dataGrid}>
in xaml.cs
CollectionView myCollectionView =
(CollectionView)CollectionViewSource.GetDefaultView(yourCollection);
dataGrid.ItemsSource = myCollectionView;
If your type has a property FirstName defined, you can then do what John Myczek pointed out.
DataGridTextColumn textColumn = new DataGridTextColumn();
dataColumn.Header = "First Name";
dataColumn.Binding = new Binding("FirstName");
dataGrid.Columns.Add(textColumn);
This obviously doesn't work if you don't know properties you will need to show in your dataGrid, but if that is the case you will have more problems to deal with, and I believe that's out of scope here.
If you already have the databinding in place John Myczek answer is complete. If not you have at least 2 options I know of if you want to specify the source of your data. (However I am not sure whether or not this is in line with most guidelines, like MVVM)
Then you just bind to Users collections and columns are autogenerated as you speficy them. Strings passed to property descriptors are names for column headers. At runtime you can add more PropertyDescriptors to 'Users' add another column to the grid.
참고URL : https://stackoverflow.com/questions/704724/programmatically-add-column-rows-to-wpf-datagrid
'IT Share you' 카테고리의 다른 글
컨텍스트 메뉴에서 클릭 한 노드 찾기 (0) | 2020.11.07 |
---|---|
Oracle user_contraints 테이블의 constraint_type 열에있는 문자 코드는 무엇을 의미합니까? (0) | 2020.11.07 |
오류 : 현재 컨텍스트에 'ConfigurationManager'이름이 없습니다. (0) | 2020.11.07 |
투명한 그라디언트를 만드는 방법? (0) | 2020.11.07 |
SQLParameter는 SQL 주입을 어떻게 방지합니까? (0) | 2020.11.07 |