c# - PropertyGrid 的替代品?请听我说完

标签 c# listview datagridview propertygrid

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

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

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

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

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

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

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

最佳答案

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

关于c# - PropertyGrid 的替代品?请听我说完,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3897831/

相关文章:

c# - 如何验证集合是否包含所有唯一对象

c# - 如何为 Windows 应用程序创建更新补丁

c# - 尽管安装了 Microsoft.ACE.OLEDB.12.0,但“Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册

c# - 如何更改 ListView 控件中单个子项的前景色?

Android ListView 滚动剪辑列表中的项目

c# - 如何在拖放期间自动滚动 DataGridView

c# - 如何重构这段代码?

c# - 在多个 GridViewColumns 中使用的通用 DataTemplate

C# - DatagridView 和上下文菜单

c# - 如何在 DataGridView 显示对象的值中自定义控件?