winform 集合编辑器样式
时间: 2023-08-26 20:06:56 浏览: 201
Winform的集合编辑器样式可以通过自定义UITypeEditor来实现。以下是一个示例代码,可以将集合编辑器的样式设置为表格(DataGridView)的形式:
```csharp
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace WinFormsApp
{
// 自定义集合编辑器
public class CustomCollectionEditor : UITypeEditor
{
private IWindowsFormsEditorService editorService;
private DataGridView dataGridView;
private List<object> collection;
private Type itemType;
public CustomCollectionEditor(Type itemType)
{
this.itemType = itemType;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
if (context != null && provider != null)
{
editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (editorService != null)
{
// 创建DataGridView控件
dataGridView = new DataGridView();
dataGridView.AutoGenerateColumns = true;
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView.DataSource = new BindingList<object>((List<object>)value);
dataGridView.CellEndEdit += DataGridView_CellEndEdit;
editorService.DropDownControl(dataGridView);
// 返回编辑后的值
return collection;
}
}
return value;
}
private void DataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
// 更新集合
collection = new List<object>();
foreach (DataGridViewRow row in dataGridView.Rows)
{
if (!row.IsNewRow)
{
object obj = Activator.CreateInstance(itemType);
foreach (DataGridViewCell cell in row.Cells)
{
var prop = itemType.GetProperty(dataGridView.Columns[cell.ColumnIndex].Name);
if (prop != null)
prop.SetValue(obj, cell.Value);
}
collection.Add(obj);
}
}
dataGridView.DataSource = new BindingList<object>(collection);
}
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown;
}
}
// 测试代码
public class TestClass
{
[Editor(typeof(CustomCollectionEditor), typeof(UITypeEditor))]
public List<TestItem> Items { get; set; }
}
public class TestItem
{
public string Name { get; set; }
public int Age { get; set; }
}
}
```
在上述代码中,我们首先定义了一个CustomCollectionEditor类,继承自UITypeEditor,并实现了EditValue和GetEditStyle方法。EditValue方法在用户点击编辑按钮时调用,返回编辑后的集合数据。在EditValue方法中,我们创建了一个DataGridView控件,并设置其数据源为当前集合值。当用户编辑数据后,DataGridView的CellEndEdit事件会触发,我们可以在该事件中更新集合数据。最后,我们返回更新后的集合数据。
在测试代码中,我们定义了一个TestClass类,包含一个Items属性,使用了我们自定义的集合编辑器。我们可以在属性面板中编辑该属性,呈现出DataGridView的形式。
阅读全文