2009-04-20 4 views
3

Я сделал небольшую примерную программу, чтобы проиллюстрировать мою проблему. Программа состоит из одной формы с одним TableLayoutPanel: tableLayoutPanel1 one NumericUpDown: монеты и одна кнопка: flip. Когда нажата кнопка flip, таблицаLayoutPanel1 динамически заполняется монетами. Добавьте строки. Каждая строка состоит из одного ComboBox с элементами «Heads» и «Tails». Один из этих элементов выбирается путем рисования случайного числа для каждой строки. код выглядит следующим образом:ComboBox: выбранное значение остается в фокусе (синий)

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; но это не работает :-(

Thaks заранее за любые ответы

ответ

2

Попробуйте положить это, прежде чем установить выбранный пункт:.!

coin.CanFocus = false; 

Или «размытость» элемент, сосредоточив что-то еще после того, как вы установите выбранный пункт:

coin.TopLevelControl.Focus(); 

EDIT 1: Я не уверен, если это будет работать для вас в вашей ситуации, б Я тестировал это и, похоже, делаю то, что вы пожелаете, или в основном; Вы должны щелкнуть элемент в списке, чтобы вызвать событие SelectedIndexChanged, но это ближе, тем не менее:

EDIT 2: Я удалил код из EDIT 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;". Счастливое кодирование!

+0

Спасибо Cory за ваш ответ, , но я не думаю, что это работает. Мне не разрешено устанавливать (только получить) свойство CanFocus. Также я добавил coin.TopLevelControl.Focus(); звонок после столLayoutPanel1.Controls.Add (монета, 0, i); , но это не имело никакого эффекта. Andreas – 2009-04-20 13:32:22

4

Вы должны установить DropDownStyle в DropDownList следующим образом. Тогда он никогда не показывает синюю подсветку, даже если она имеет фокус, потому что текст не редактируется (это то, что вы хотите в любом случае).

coin.DropDownStyle = ComboBoxStyle.DropDownList; 
+2

Thanks Jay, Это работает, но проблема в том, что в моем реальном приложении мне нужно иметь возможность редактировать текст. Andreas – 2009-04-20 13:34:43

+0

Это, 10000 раз это! – Sidney

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

+0

Большое спасибо, это действительно работает! – JacobE

Смежные вопросы