【问题标题】:Is there a simple way to implement a Checked Combobox in WinForms [duplicate]有没有一种简单的方法可以在 WinForms 中实现 Checked Combobox [重复]
【发布时间】:2012-02-08 00:14:26
【问题描述】:

有谁知道 WinForms 中选中的组合框的简单实现?谷歌搜索时我找不到任何东西。

我想要一些类似于 Windows 计划任务触发器编辑的东西:

【问题讨论】:

    标签: c# vb.net winforms combobox checkbox


    【解决方案1】:

    这就是你想要的,我只是自己编写的
    这个概念非常简单,使用面板并在其上添加复选框。然后 强制组合框禁用它的下拉菜单,但您仍然可以单击其向下箭头。使用组合框的DropDownDropDownClosed 事件。当您将组合框的列表向下设置面板的Visible 属性为True 时,在您关闭组合框的下拉菜单时将其隐藏。

    //designer class
    
    // 
    // comboBox1
    // 
    this.comboBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
    this.comboBox1.DropDownHeight = 1;
    this.comboBox1.DropDownWidth = 1;
    this.comboBox1.FormattingEnabled = true;
    this.comboBox1.IntegralHeight = false;
    this.comboBox1.Location = new System.Drawing.Point(256, 371);
    this.comboBox1.Name = "comboBox1";
    this.comboBox1.Size = new System.Drawing.Size(238, 21);
    this.comboBox1.TabIndex = 5;
    this.comboBox1.DropDown += new System.EventHandler(this.comboBox1_DropDown);
    this.comboBox1.DropDownClosed += new System.EventHandler(this.comboBox1_DropDownClosed);
    // 
    // panel1
    // 
    this.panel1.BackColor = System.Drawing.Color.White;
    this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
    this.panel1.Controls.Add(this.checkBox9);
    this.panel1.Controls.Add(this.checkBox8);
    this.panel1.Controls.Add(this.checkBox7);
    this.panel1.Controls.Add(this.checkBox6);
    this.panel1.Controls.Add(this.checkBox5);
    this.panel1.Controls.Add(this.checkBox4);
    this.panel1.Controls.Add(this.checkBox3);
    this.panel1.Controls.Add(this.checkBox2);
    this.panel1.Controls.Add(this.checkBox1);
    this.panel1.Location = new System.Drawing.Point(252, 394);
    this.panel1.Name = "panel1";
    this.panel1.Size = new System.Drawing.Size(245, 68);
    this.panel1.TabIndex = 6;
    // 
    // checkBox9
    // 
    this.checkBox9.AutoSize = true;
    this.checkBox9.Location = new System.Drawing.Point(162, 48);
    this.checkBox9.Name = "checkBox9";
    this.checkBox9.Size = new System.Drawing.Size(80, 17);
    this.checkBox9.TabIndex = 9;
    this.checkBox9.Text = "checkBox9";
    this.checkBox9.UseVisualStyleBackColor = true;
    // 
    // checkBox8
    // 
    this.checkBox8.AutoSize = true;
    this.checkBox8.Location = new System.Drawing.Point(162, 27);
    this.checkBox8.Name = "checkBox8";
    this.checkBox8.Size = new System.Drawing.Size(80, 17);
    this.checkBox8.TabIndex = 8;
    this.checkBox8.Text = "checkBox8";
    this.checkBox8.UseVisualStyleBackColor = true;
    // 
    // checkBox7
    // 
    this.checkBox7.AutoSize = true;
    this.checkBox7.Location = new System.Drawing.Point(162, 4);
    this.checkBox7.Name = "checkBox7";
    this.checkBox7.Size = new System.Drawing.Size(80, 17);
    this.checkBox7.TabIndex = 7;
    this.checkBox7.Text = "checkBox7";
    this.checkBox7.UseVisualStyleBackColor = true;
    // 
    // checkBox6
    // 
    this.checkBox6.AutoSize = true;
    this.checkBox6.Location = new System.Drawing.Point(82, 47);
    this.checkBox6.Name = "checkBox6";
    this.checkBox6.Size = new System.Drawing.Size(80, 17);
    this.checkBox6.TabIndex = 5;
    this.checkBox6.Text = "checkBox6";
    this.checkBox6.UseVisualStyleBackColor = true;
    // 
    // checkBox5
    // 
    this.checkBox5.AutoSize = true;
    this.checkBox5.Location = new System.Drawing.Point(82, 26);
    this.checkBox5.Name = "checkBox5";
    this.checkBox5.Size = new System.Drawing.Size(80, 17);
    this.checkBox5.TabIndex = 4;
    this.checkBox5.Text = "checkBox5";
    this.checkBox5.UseVisualStyleBackColor = true;
    // 
    // checkBox4
    // 
    this.checkBox4.AutoSize = true;
    this.checkBox4.Location = new System.Drawing.Point(82, 4);
    this.checkBox4.Name = "checkBox4";
    this.checkBox4.Size = new System.Drawing.Size(80, 17);
    this.checkBox4.TabIndex = 3;
    this.checkBox4.Text = "checkBox4";
    this.checkBox4.UseVisualStyleBackColor = true;
    // 
    // checkBox3
    // 
    this.checkBox3.AutoSize = true;
    this.checkBox3.Location = new System.Drawing.Point(3, 47);
    this.checkBox3.Name = "checkBox3";
    this.checkBox3.Size = new System.Drawing.Size(80, 17);
    this.checkBox3.TabIndex = 2;
    this.checkBox3.Text = "checkBox3";
    this.checkBox3.UseVisualStyleBackColor = true;
    // 
    // checkBox2
    // 
    this.checkBox2.AutoSize = true;
    this.checkBox2.Location = new System.Drawing.Point(4, 24);
    this.checkBox2.Name = "checkBox2";
    this.checkBox2.Size = new System.Drawing.Size(80, 17);
    this.checkBox2.TabIndex = 1;
    this.checkBox2.Text = "checkBox2";
    this.checkBox2.UseVisualStyleBackColor = true;
    // 
    // checkBox1
    // 
    this.checkBox1.AutoSize = true;
    this.checkBox1.Location = new System.Drawing.Point(4, 4);
    this.checkBox1.Name = "checkBox1";
    this.checkBox1.Size = new System.Drawing.Size(80, 17);
    this.checkBox1.TabIndex = 0;
    this.checkBox1.Text = "checkBox1";
    this.checkBox1.UseVisualStyleBackColor = true;
    

    public Form1()
    {
        InitializeComponent();
        panel1.Visible =false;
    }
    
    
    private void comboBox1_DropDown(object sender, EventArgs e)
    {
        panel1.Visible = true;
    }
    
    private void comboBox1_DropDownClosed(object sender, EventArgs e)
    {
        panel1.Visible = false;
    }
    

    【讨论】:

    • 谢谢我已经实现了与此非常相似的东西,尽管我使用了 ListViewCheckBoxes = True 而不是面板,因此我不必担心对齐复选框
    • 如果我实现这个,只要我点击 panel1,下拉菜单就会关闭,从而导致面板隐藏。
    • 我和@MSStp有同样的问题
    • 这不起作用,因为我们没有将面板添加到组合框下拉列表中,所以每当我们单击面板项时,组合框都会认为我们正在单击它之外,因此它正在关闭面板(这是组合框的默认行为)。
    • 我们可以使用 MouseClick 事件 private void comboBox1_MouseClick(object sender, MouseEventArgs e ) { 组合框1.DroppedDown = false; if (panel1.Visible) { panel1.Visible = false; } 其他 { panel1.Visible = true; } }
    【解决方案2】:

    快速浏览一下屏幕截图,似乎实际上有两个控件,一个组合框和一个复选框。您应该可以使用组合框的 DropDown 方法使复选框可见,然后一旦用户离开复选框,将选中的值作为文本附加到组合框(并使复选框再次不可见)。只是一个想法;无权访问编辑器以查看这是否可能,但似乎有可能。

    【讨论】:

    • 是的,我在发帖后也有同样的想法 - 我认为这是我将采取的方法,看看涉及多少工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2021-06-24
    • 2023-03-20
    • 1970-01-01
    • 2010-11-09
    • 2016-09-24
    • 1970-01-01
    相关资源
    最近更新 更多