C# 房地产网格的替代方案?请听我说完

C# 房地产网格的替代方案?请听我说完,c#,listview,datagridview,propertygrid,C#,Listview,Datagridview,Propertygrid,我知道这是一个广泛的话题,但请听我说完 我有几个实例需要编辑一组相关属性。一些是自由文本,另一个可能是整数或密码,更多的是预定义的选项(选择框)。我基本上需要一个容器,在左边重复文本行,在右边有一个控件 我不能使用PropertyGrid,因为我并不总是有一个实例,而且我在理解它需要的所有ipropertyeditorservice属性和帮助程序时遇到了一些困难 我不能使用DataGrid或DataGridView,因为它们是基于列的。每一行可能需要一种不同类型的控件,因此一列中满是任何一种控件

我知道这是一个广泛的话题,但请听我说完

我有几个实例需要编辑一组相关属性。一些是自由文本,另一个可能是整数或密码,更多的是预定义的选项(选择框)。我基本上需要一个容器,在左边重复文本行,在右边有一个控件


我不能使用PropertyGrid,因为我并不总是有一个实例,而且我在理解它需要的所有ipropertyeditorservice属性和帮助程序时遇到了一些困难

我不能使用DataGrid或DataGridView,因为它们是基于列的。每一行可能需要一种不同类型的控件,因此一列中满是任何一种控件类型都是无用的

我尝试扩展ListView,这正是我目前遇到的问题。它的所有者绘制并在第二列的边界内绘制控件。看起来还可以,但微软的固定行高是个问题。我认为它脱离了图像列表或字体,即使textbox和combobox也不能同意以相同的方式调整大小,而忘记了复选框或其他任何东西。我的意思是,在我特定的桌面设置上,单线控制看起来正常,但我不能控制每个分辨率的重叠

我自己想出的另一个想法(除了放弃或从System.Windows.Forms.Control中派生出一些非标准和丑陋的东西)是将所有这些子控件塞进一个TableLayoutContainer中。它主要解决了奇怪的高度问题,但我丢失了ListView的标题和滚动功能


几周来我一直在寻找替代品,但我就是找不到。每个人都将datagridview和listview改造为datagrid,甚至是商业解决方案。我不敢相信没有一个简单的替代品可以替代PropertyGrid的功能。我的ListView是很多坏东西中最好的一个…我还能做什么?

您尝试过“VisualHint”属性网格替换吗?关于信息,对于灵活的属性绑定,如果您不想了解系统的本质,DataTable非常方便。componentmodel

尝试使用TableLayoutPanel

Label l1 = new Label();
Label l2 = new Label();
Label l3 = new Label();
Label l4 = new Label();
l1.Text = "Name";
l2.Text = "Color";
l3.Text = "Quantity";
l4.Text = "Notes";
TextBox c1 = new TextBox();
ComboBox c2 = new ComboBox();
NumericUpDown c3 = new NumericUpDown();
TextBox c4 = new TextBox();
c2.Items.AddRange(new string[] { "Red", "Green", "Blue" });

//tableLayoutPanel1.GrowStyle = TableLayoutPanelGrowStyle.AddRows;
//tableLayoutPanel1.AutoScroll = true;
tableLayoutPanel1.AutoSize = true;
tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
tableLayoutPanel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Inset;
int rowIndex = 0;
tableLayoutPanel1.SuspendLayout();
foreach (Control[] pair in new Control[][] {
   new Control[] {l1, c1},
   new Control[] {l2, c2},
   new Control[] {l3, c3},
   new Control[] {l4, c4}})
{
   tableLayoutPanel1.Controls.AddRange(pair);
   if (tableLayoutPanel1.RowStyles.Count <= rowIndex)
      tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));
   else
      tableLayoutPanel1.RowStyles[rowIndex++].SizeType = SizeType.AutoSize;
}
tableLayoutPanel1.ResumeLayout();
Label l1=新标签();
标签l2=新标签();
标签l3=新标签();
标签l4=新标签();
l1.Text=“名称”;
l2.Text=“颜色”;
l3.Text=“数量”;
l4.Text=“注释”;
TextBox c1=新的TextBox();
ComboBox c2=新的ComboBox();
NumericUpDown c3=新的NumericUpDown();
TextBox c4=新的TextBox();
c2.Items.AddRange(新字符串[]{“红色”、“绿色”、“蓝色”});
//tableLayoutPanel1.GrowthStyle=TableLayoutPanelGrowthStyle.AddRows;
//tableLayoutPanel1.AutoScroll=true;
tableLayoutPanel1.AutoSize=true;
tableLayoutPanel1.AutoSizeMode=System.Windows.Forms.AutoSizeMode.GrowtandShrink;
tableLayoutPanel1.CellBorderStyle=TableLayoutPanelCellBorderStyle.Inset;
int rowIndex=0;
tableLayoutPanel1.SuspendLayout();
foreach(新控件[]中的控件[]对[]{
新控件[]{l1,c1},
新控件[]{l2,c2},
新控件[]{l3,c3},
新控件[]{l4,c4})
{
tableLayoutPanel1.Controls.AddRange(成对);

如果(tableLayoutPanel1.RowStyles.Count我两次遇到你的问题

第一次,我继承了ListBox控件并创建了自己的控件,这不是一项容易的任务,我在布局、聚焦事件、鼠标滚轮等方面遇到了一些问题

第二次,我使用了PropertyGrid控件,但是如果类中的值发生了更改,我在隐藏和禁用某些字段时也遇到了一些问题

我想,如果我再次需要控件,我会使用第三方控件,有很多,我想ComponentOne有一个


祝你好运。

“我不能使用PropertyGrid,因为我不总是有实例”:你是什么意思?我的意思是PropertyGrid希望我将它指向一个可以进行反射的对象/类,我只希望能够将随机控件组合在一起。我尝试过,做得很好,我认为如果用CustomControl封装它会更有帮助。我想这差不多是我能得到的。我更喜欢一些免费的源代码示例,但至少ComponentOne的产品超过1000美元。