C # TreeView SetFocus увольнение дважды - PullRequest
1 голос
/ 10 ноября 2010

У меня есть этот простой код, где, когда пользователь покидает элемент управления TextBox, TreeView фокусируется:

    public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.treeView1.Nodes.Add("A");
        this.treeView1.Nodes[0].Nodes.Add("A.A");

        this.treeView1.Nodes.Add("B");
        this.treeView1.Nodes[0].Nodes.Add("B.A");

    }



    private void textBox1_Leave(object sender, EventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Leave..");
        this.treeView1.Focus();
    }
}

Если мы выполняем этот код, событие Leave запускается дважды:

Leave..
Leave ..

Но если мы установим фокус на другой элемент управления, будет запущено только одно событие Leave.

Это проблема TreeView?Вы знаете какой-нибудь обходной путь?Должны ли мы сообщить об этом в Microsoft?

Спасибо, RG

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010
    this.treeView1.Focus();

Do not используйте метод Focus () в обработчике событий, который вызывается из-за события фокусировки, такого как Leave. Если вам нужно предотвратить изменение фокуса, используйте вместо этого событие Validating. Установка e.Cancel = true останавливает его.

Но учтите, что это не очень логично для TreeView, пользователь ничего не может сделать, чтобы изменить состояние элемента управления. Вы поймаете пользователя в ловушку. Возможно, так и было задумано, убедитесь, что пользователь все еще может закрыть окно. Если нет, то вам может потребоваться событие FormClosing, чтобы принудительно вернуть e.Cancel в значение false.

0 голосов
/ 10 ноября 2010

Учитывая, что там нет кода для подключения к событию, я предполагаю, что вы сделали это от дизайнера, что означает строку кода, такую ​​как

textBox1.Leave += new EventHandler(textBox1_Leave);

будет добавлено в Form1.designer.cs, проверьте этот файл, чтобы убедиться, что строка не существует более одного раза, так как при каждом запуске этой строки вы получите триггер события, поэтому, если вы запустите строку 3 раза событие Leave срабатывает 3 раза, когда вы покидаете текстовое поле!

НТН

OneShot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...