Pergunta

No WinForms, para o foco definido para um controle específico, eu sempre parecem acabar Control.Select() chamando e Control.Focus() para obtê-lo para o trabalho.

Qual é a diferença, e esta é a abordagem correta?

Foi útil?

Solução

O foco é um método de baixo nível destina-se principalmente para os autores de controle personalizados. Em vez disso, os programadores de aplicativos deve usar o método Select ou a propriedade ActiveControl para controles filho, ou o método Activate para formulários.

http://msdn.microsoft. com / en-us / library / system.windows.forms.control.focus.aspx

Outras dicas

Focus () é a função de baixo nível que realmente define o foco.

Select () é um método de nível higer. Ele primeiro procura iterativa para cima na hierarquia pai do controle até encontrar um controle de recipiente. Em seguida, ele define a propriedade ActiveControl desse container (o chamado controle). A lógica desses métodos não é simples no entanto, e não há tratamento especial para recipientes UserControl.

Para um exemplo de como eles são diferentes, se você está tentando definir um controle para um aplicativo de formulários para foco padrão para quando você abri-lo, selecione somente () irá funcionar quando chamado no construtor depois InitializeComponent (). Focus () não vai.

Só para acrescentar a esta discussão eu descobri que quando se escreve um controle de usuário que moveu outros controles de uma forma para outra (formulário recém-criado). A forma original já não podia selecionar o controle, mas usando o foco autorizados a fazê-lo. Eu acho que isso enfatiza as respostas sobre os níveis esses métodos trabalhar. Mas isso também significa que não é suficiente simples dizer uso Select no nível mais elevado desde escolha já não funcionou como esperado na forma original (não que ele deve ser Coloquei-o em uma forma diferente - Eu aceito isso)

Focus (), em algumas situações, pode causar uma janela de possuir o controle de foco ganho se não tem foco. Selecione () não causa uma garra foco pela janela.

A partir da experiência pessoal Eu escrevi um controle de usuário herdando do Windows ComboBox. Eu tinha que escrever código para substituir o evento OnEnter e eu tivemos uma declaração lá dizendo

If Me.Focused Then ... Else ...

No entanto, infelizmente, devolveu o resultado inesperado. Se eu chamada MyCustomerComboControl.Select (em qualquer carga, Mostrado ou eventos ativado) que chamou o método OnEnter mas não conseguiu registrá-lo tinha o foco (ou seja Focada era falso), mas se eu chamasse Foco funcionou. Além disso Select trabalhou se o formulário foi aberto ou seja, se eu selecionei um outro controle, em seguida, re-selecionados do controle original estava tudo bem. Assim, em quaisquer outros que o meu cenário circunstâncias, o uso Select porque diz tão acima.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top