WinForms: событие Textbox Leave не становится запущенным после перехода в главное меню

Я бы предложил использовать random.shuffle , затем list.pop , чтобы избежать дублирования ключей и значений, чтобы всегда иметь три элемента в dict (пропущенный пользовательский ввод, уже показано в других ответах):

import random

colors=['black','blue','green','red','yellow']
nums=[1,2,3,4,5]

res = {}
for _ in range(3):
    random.shuffle(colors)
    random.shuffle(nums)
    num, color = nums.pop(), colors.pop()
    res[num] = color

print(res)
#=> {4: 'green', 3: 'yellow', 1: 'black'}
print(res[1])
#=> black

print(colors, nums) # not used
#=> ['blue', 'red'] [2, 5]

7
задан Grzenio 1 December 2008 в 14:26
поделиться

5 ответов

Я нашел разумное обходное решение, я установил внимание на главное меню вручную:

Править: Как предложено @TcKs, я изменил событие от ItemClicked до MenuActivate. Большое спасибо за справку!

    private void menuStrip1_MenuActivate( object sender, EventArgs e )
    {
        menuStrip1.Focus();
    }
6
ответ дан 7 December 2019 в 05:32
поделиться

Необходимо использовать события "Validating" и "Validated" для проверки входа пользователя. Затем, если пользователь перейдет к другому управлению "A", и управлению "A" установили свойство "CausesValidating" на "истинный" (его значение по умолчанию), то событие "Validating" и "Validated" будет запущено.

Меню имеет свойство "CuasesValidating" также.

Править: Извините, я забыл, что "CuasesValidating" в полосе меню является нашей функциональностью и не встроенный. Но проверка на проверку довольно проста:

private void menuStrip1_MenuActivate( object sender, EventArgs e ) {
    bool ret = this.Validate( false );
    if ( false == ret ) {
        // user's input is wrong
    }
}

Пользователь любой ContainerControl вместо "этого", если Вы хотите, проверяет проверку в другое управление, чем "эта" форма. Например, в Дочернем окне MDI.

2
ответ дан 7 December 2019 в 05:32
поделиться

Существуют некоторые случаи, когда Lostfocus не запущен, например, нажав кнопки на панели инструментов и пункты меню. Я использую, чтобы работать вокруг этого с локальной переменной "LastControl" и обработать ее сам, когда меню получило фокус.

Существуют причины, что щелчок меню не делает теряет фокус текстового поля. Если Вы хотите иметь, например, меню "Edit" со "Вставкой" в, "Вставка" должна действовать против управления, которое фокусируется, и из-за этого это не должно красть фокус ни из каких средств управления на форме.

Таким образом, меню может рассматриваться как контекстное меню, которые не крадут фокус из управления.

1
ответ дан 7 December 2019 в 05:32
поделиться

при проигрывании с меню необходимо моделировать, так или иначе, lostfocus и возможно помнящий, где это было в случае, если Вы закрываете меню, ничего не делая так, что фокус возвратился бы в текстовое поле

0
ответ дан 7 December 2019 в 05:32
поделиться

Вам нужна маркировка 1 пиксель на 1 пиксель

Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave
    MsgBox("yes")
End Sub

Private Sub MenuStrip1_MenuActivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuActivate
    CType(sender, MenuStrip).Tag = ActiveControl
    Label1.Focus()
End Sub

Private Sub MenuStrip1_MenuDeactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuDeactivate
    If CType(sender, MenuStrip).Tag Is Control AndAlso CType(CType(sender, MenuStrip).Tag, Control).CanFocus Then
        CType(CType(sender, MenuStrip).Tag, Control).Focus()
    End If
    CType(sender, MenuStrip).Tag = Nothing
End Sub
-1
ответ дан 7 December 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: