我制作了一个小例子程序来说明我的问题。 该程序由一个表格和一个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;但这不起作用:-(。
预先提出任何答案!
答案 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);
}
}
}
答案 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);
}