ComboBox:所选值保持清晰(蓝色)

时间:2009-04-20 12:48:26

标签: c# .net

我制作了一个小例子程序来说明我的问题。 该程序由一个表格和一个TableLayoutPanel组成:tableLayoutPanel1一个NumericUpDown:硬币和一个Button:flip。 当按下flip时,tableLayoutPanel1动态地填充coin.Value行。 每行包含一个ComboBox,其中包含“Heads”和“Tails”项。 通过为每行绘制一个随机数来选择其中一个项目。 代码如下:

    namespace WindowsApplication1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();     
        }


        private void draw_Click(object sender, EventArgs e)
        {
          tableLayoutPanel1.Controls.Clear();
          string[] results = { "Heads", "Tails" };
          int nCoins = Convert.ToInt32(coins.Value);
          Random random = new Random();
          for(int i = 0; i < nCoins; i++) {
            ComboBox coin = new ComboBox();
            coin.Items.AddRange(results);
            coin.SelectedIndex = random.Next(0, 2);
            tableLayoutPanel1.Controls.Add(coin, 0, i);
          }
       }
    }
 }

我的问题是每个ComboBox中的所选项目都有焦点,即为蓝色。 我如何阻止这种情况发生? 我试过调用coin.SelectionLength = 0;但这不起作用:-(。

预先提出任何答案!

4 个答案:

答案 0 :(得分:4)

你应该像这样将DropDownStyle设置为DropDownList。然后它永远不会显示蓝色突出显示,即使它具有焦点,因为文本不可编辑(这也是你想要的)。

coin.DropDownStyle = ComboBoxStyle.DropDownList;

答案 1 :(得分:3)

试试这个:

public class CustomComboBox : ComboBox
{
    private const int WM_SIZE = 0x0005;

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        // A fix for ComboBoxStyle.DropDown mode.
        if (DropDownStyle == ComboBoxStyle.DropDown
            && (m.Msg & WM_SIZE) == WM_SIZE)
        {
            Select(0, 0);
        }
    }
}

See: ComboBox Resize Oddity

答案 2 :(得分:2)

在设置所选项目之前尝试执行此操作:

coin.CanFocus = false;

或者在设置所选项目后通过聚焦其他内容来“模糊”元素:

coin.TopLevelControl.Focus();

编辑1 :我不确定这在你的情况下是否适合你,但我测试了它,它似乎做你想要的,或者大多数;你必须单击列表中的一个项来触发SelectedIndexChanged事件,但它仍然更接近:

编辑2 :我从编辑1中删除了代码。我认为现在可以使用了!

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click += new EventHandler(button1_Click);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            tableLayoutPanel1.Controls.Clear();
            string[] results = { "Heads", "Tails" };
            int nCoins = Convert.ToInt32(coins.Value);
            Random random = new Random();
            for (int i = 0; i < nCoins; i++)
            {
                ComboBox coin = new ComboBox();
                coin.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
                coin.Items.AddRange(results);
                coin.SelectedIndex = random.Next(0, 2);
                tableLayoutPanel1.Controls.Add(coin, 0, i);
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.ActiveControl = null;
        }

    }
}

键位于SelectedIndexChanged事件的“this.ActiveControl = null;”行。快乐的编码!

答案 3 :(得分:0)

只需为您不想在调整大小时选择文本的所有ComboBox使用以下代码:

/// <summary>
/// Stop resizing of the Form from selecting ComboBox's text.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <remarks>Used for all ComboBox'es</remarks>
private void cbo_Resize(object sender, EventArgs e)
{
    ((ComboBox)sender).Select(0, 0);
}