Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “在windows窗体中使用自定义控件”复选框_C#_Winforms_User Controls_Listbox - Fatal编程技术网

C# “在windows窗体中使用自定义控件”复选框

C# “在windows窗体中使用自定义控件”复选框,c#,winforms,user-controls,listbox,C#,Winforms,User Controls,Listbox,Windows窗体中选中列表框控件的Items属性是object类型,因此我天真的希望可以将自定义用户控件添加为item。(因为,通常我的任务是为后台任务编写逻辑,我对UI编程不太熟悉,所以这可能是一个愚蠢的想法。) 更确切地说,我希望在复选列表框的每一行中显示两个标签和一个按钮。第一个标签应该显示用户可以选择的对象的名称(以便稍后对所有选中项目执行特定操作)。对于选中的任何项目,按钮应允许用户选择一个文件,从中可以读取自定义设置以执行该操作,第二个标签应显示用户使用按钮所做的选择(即文件名或类

Windows窗体中选中列表框控件的
Items
属性是object类型,因此我天真的希望可以将自定义用户控件添加为item。(因为,通常我的任务是为后台任务编写逻辑,我对UI编程不太熟悉,所以这可能是一个愚蠢的想法。)

更确切地说,我希望在复选列表框的每一行中显示两个标签和一个按钮。第一个标签应该显示用户可以选择的对象的名称(以便稍后对所有选中项目执行特定操作)。对于选中的任何项目,按钮应允许用户选择一个文件,从中可以读取自定义设置以执行该操作,第二个标签应显示用户使用按钮所做的选择(即文件名或类似字符串“默认设置”)

因此,在表单设计器中,我使用
label1
label2
button1
,创建了一个自定义控件
CustomControl1
,以及设置文本属性、将标签和按钮的自动大小设置为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;
编译时不会出现任何错误,也会运行,但选中列表框显示一个空字段。我还试验了列表框的大小。如果我降低高度,使复选框正好适合它,那么我会在相应的行中看到按钮的碎片,但没有标签

是否可以在选中的列表框中使用自定义表单?如果可以,我缺少什么?

不,您不能这样做

列表框仅显示元素列表。列表框为列表中的每个对象使用属性
.ToString()
,以显示项目


您需要寻找一个

这个逻辑是某种
WPF
东西,而不是
winforms
。在winforms中,您必须为列表框的每个项目绘制所有内容,这意味着您必须在每个项目中绘制UserControl,如果您的UserControl有一个按钮,您还必须绘制该按钮,使用一些hittesting来提供用户与所绘制项目上的控件之间的交互。。。。这确实很复杂。另一种方法是在listBox中托管所有用户控件,这需要一些停靠。我想您只需要一些面板,在这种情况下,启用
AutoScroll
,并在该面板上添加UControls。您的问题与我问的问题类似。我从中得到的回应是,winforms是一个完全无用的垃圾,如果你想要定制UI的任何方面,或者创建任何与默认的、丑陋的、无聊的、类似Windows 3.1的winforms东西相差1像素的东西,你需要一个体面的、可用的技术(WPF)。或者,如果您想要一个支持真实数据绑定的UI框架,并且不强迫您键入大量无用的代码。既然您已经有一个自定义控件要显示,为什么不为它创建一个自定义容器呢?或者,如果您真正想要的是以列表类型的格式显示它们,则将它们放入
表格布局面板
,该面板可以定义为一列多行。它看起来和感觉都像一个列表。如果您需要所有的Add、Insert等帮助程序,那么您也需要为其编写一个容器。
private void Form1_Load(object sender,EventArgs e)
    {
        checkedListBox1.Items.Add("IIT");
        checkedListBox1.Items.Add("CSE");
        checkedListBox1.Items.Add("EEE");
        checkedListBox1.Items.Add("ICT");
        checkedListBox1.Items.Add("URP");
        checkedListBox1.Items.Add("ENGLISH");
        checkedListBox1.Items.Add("BANGLA");
        checkedListBox1.Items.Add("MATH");
    }
    private void checkedListBox1_SelectedIndexChanged(object sender,EventArgs e)
    {
        //var item=checkedListBox1.SelectedItem;

        label1.Text=checkedListBox1.SelectedItem.ToString();
    }