Redimensionar um controle WinForms caixa de texto com base em MaxLength
Pergunta
Eu tenho uma situação (uma pesquisa baseada em chave) onde eu vou ter várias entradas de variar, mas limitado, comprimento. Então, eu estou construindo um controle comum a utilizar para cada entrada, e esse controle tem uma caixa de texto para uso quando o tipo de entrada é o texto de forma livre. Nesse caso, eu gostaria que o comprimento da caixa de texto para refletir a restrição colocada na entrada baseada na propriedade MaxLength do TextBox (ou pelo menos em um comprimento máximo de algum tipo).
Como posso fazer isso? Sei que isso é tecnicamente impossível com caracteres de largura variável, mas eu estou interessado em obter perto. Os campos variar em comprimento máximo de 3 caracteres para cerca de 90.
Solução 5
Com base no que foi dito até agora, eu acho que a solução ideal neste caso é uma combinação de sugestão de John e que diante put por Mitchel e overslacked. Então, eu estou indo para calcular os comprimentos usando um personagem padrão (diga "C"), e, em seguida, definir a largura igual a [fronteira folga] + ([comprimento de caracteres] * ([número de caracteres] + [5 - número A modificação de caracteres 5])).
Vou ter que recalcular o comprimento de caracteres eo campo largura qualquer momento as alterações de fonte.
Outras dicas
Gostaria de tentar evitar essa abordagem dinâmica.
Você realmente acha que ele agrega valor para o usuário? Na minha opinião, parece estranho, quando um controle comum tem um olhar diferente o tempo todo. Você acha que o usuário pode diferir entre uma caixa de texto que permite que 32 caracteres e um que permite que 29 caracteres? Como sobre valores extrem? Quando, por exemplo apenas três caracteres são permitidos - ou mesmo 1024.
Eu faria o TextBox o mesmo comprimento, sempre - que é melhor para o seu controle e mais fácil de implementar. Quando o usuário precisa de uma dica sobre o comprimento máximo do texto adicionar um rótulo que diz "29 caracteres esquerda" e que as atualizações durante a entrada ...
Uma maneira que você pode ser capaz de fazer isso, mas não é 100% exato seria usar o método "MeasureString" do objeto Graphics, para ver como personagens X larga é, com o tipo de letra que é usado atualmente pela caixa de texto.
A partir daí você pode então calcular o necessário "extra" para cobrir as fronteiras etc. Não é uma ciência exata, mas ele iria trabalhar.
Other Thoughts
Medir a seqüência inteira pode ser um pouco ineficiente, você poderia medir 1 personagem X (que é tipicamente maior do que outros), em seguida, multiplicá-lo por todos
Seria mais simples e potencialmente mais visualmente agradável, para "pedaço" os tamanhos da caixa de texto. Escolha uma largura que funciona para campos de 1-5 caracteres, em seguida, uma largura de 6-10, então 11-20,20-30,30-50, etc. Dessa forma, você pode evitar os problemas de alinhamento visuais estranhos que aconteceriam se você tentou campos verticalmente pilha de 29, 32 e 27 caracteres.
Este é (quase) impossível com fontes de largura variável.
Eu acho que você poderia tentar encontrar um personagem relativamente 'grande', mas que ainda pode causar problemas.
A solução mais fácil seria provavelmente para encontrar uma largura de carácter satisfatório (e provavelmente codificar este por tamanho da fonte / família), e, em seguida, basta multiplicar que com o comprimento máximo.