PropertyGrid的替代品?请听我说

时间:2010-10-09 20:48:58

标签: c# listview datagridview propertygrid

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

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

我不能使用PropertyGrid,因为我并不总是有一个实例,而且我一直难以理解它想要的所有ipropertyeditorservice属性和帮助器。

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

我尝试扩展ListView,这是我现在被困住的地方。它的所有者绘制并在第二列的范围内绘制控件。它看起来不错,但微软的固定行高是一个问题。我认为它取决于图像列表或字体,甚至文本框和组合框也不能同意以相同的方式调整自己的大小而忘记了一个checklistbox或其他任何东西。我的意思是我的特定桌面设置上的单行控件通常看起来不错,但我无法控制每个分辨率的重叠。

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

我一直在寻找替代方案几周,我找不到任何东西。每个人都重新创建了datagridview和listview-as-datagrid,甚至是商业解决方案。我无法相信没有一个简单的替代品来解决PropertyGrid的问题。我的ListView是最好的很多不好的...我还能做什么?

3 个答案:

答案 0 :(得分:3)

尝试使用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();

答案 1 :(得分:1)

您是否尝试过“VisualHint”属性网格替换?有关信息,对于灵活的属性绑定,如果您不想学习system.componentmodel的内容,DataTable可以非常方便

答案 2 :(得分:1)

我有两次你的问题,

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

第二次,我使用了PropertyGrid控件,但是如果类中的值发生了变化,我在隐藏和禁用某些字段方面也存在一些问题,

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

祝你好运。