【发布时间】:2014-01-03 14:57:42
【问题描述】:
Windows 窗体中选中列表框控件的Items 属性是对象类型,所以我天真地希望我可以添加一个自定义的用户控件作为项目。 (因为,通常,我的任务是为我不太熟悉 UI 编程的后台任务编写逻辑,所以这可能是一个愚蠢的想法..)
更准确地说,我想在选中列表框的每一行中显示两个标签和一个按钮。第一个标签应该显示用户可以选择的对象的名称(以便稍后将对所有选中的项目执行特定操作)。对于选中的任何项目,按钮应该允许用户选择一个文件,从该文件中可以读取自定义设置以执行该操作,第二个标签应该显示用户使用按钮所做的选择(即文件名或其他内容)比如字符串“默认设置”)。
因此,在表单设计器中,我创建了一个自定义控件CustomControl1,其中包含label1、label2、button1,以及设置文本属性、设置标签的自动大小和按钮为 false 的方法,手动定义它们的大小。然后在主窗口中,我创建了选中的列表框,并在其中添加了自定义控件。我的主窗口的构造函数现在如下所示:
InitializeComponent();
UserControl1 uc1 = new UserControl1();
uc1.setLabel1("label1_text");
uc1.setLabel2("label2_text");
uc1.setButtonText("button_text");
this.checkedListBox1.Items.Add(uc1);
uc1.Visible = true;
这编译没有任何错误并且也运行,但是选中的列表框显示一个空字段。我还尝试了列表框的大小。如果我降低高度以使复选框刚好适合它,那么我确实会在相应的行中看到按钮的片段,但没有标签。
是否可以在选中的列表框中使用自定义表单,如果可以,我缺少什么?
【问题讨论】:
-
这个逻辑是某种
WPF的东西,而不是winforms。在winforms中,你必须为listBox的每个项目绘制所有内容,这意味着你必须在每个项目中绘制你的UserControl,如果你的UserControl有一个Button,你还必须绘制那个按钮,使用一些hittesting来提供交互性在用户和绘制项目上的控件之间......确实非常复杂。另一种方法是将所有用户控件托管在列表框中,它需要一些对接。我认为您只需要一些 Panel 在这种情况下,启用AutoScroll并在该面板上添加 UControls。 -
你的问题和我问的here类似。我得到的回应是,winforms 是一个完全没用的垃圾,如果你想自定义 UI 的任何方面,或者创建任何距离只有 1 个像素的东西,你需要一个体面的、可用的技术 (WPF)默认的、丑陋的、无聊的、类似 Windows 3.1 的 winforms 东西。或者,如果您想要一个支持 REAL DataBinding 并且不会强迫您在后面输入大量无用代码的 UI 框架。
-
既然您已经有一个自定义控件要显示,为什么不为其创建一个自定义容器呢?或者,如果您真正想要的只是一种以列表类型格式显示它们的方法,则将它们放入
TableLayoutPanel,它可以定义为 1 列和多行。它看起来和感觉就像一个列表。如果您需要所有的 Add、Insert 等帮助程序,那么您也在为它编写一个容器。
标签: c# winforms user-controls listbox