20 01 2016
Mudando a fonte da mensagem de erro do Report Viewer
Com as resoluções dos monitores aumentando a cada dia, muitas vezes é difícil do usuário conseguir ler algumas partes do nosso aplicativo ao utilizar uma resolução muito alta.
Ao contrário do WPF, no Windows Forms isso é muito comum, uma vez que a maioria dos controles não é “DPI aware” (ou seja, seu tamanho não se ajusta automaticamente ao aumentarmos ou diminuirmos o DPI).
No artigo de hoje eu vou mostrar para você como é fácil alterar a fonte da mensagem de erro do Report Viewer.
Essa dúvida veio do meu amigo Bruno Maestro (que também é Microsoft MVP). Ele queria saber como aumentar a fonte da mensagem de erro do controle do Report Viewer, porque com resoluções muito altas, fica difícil de conseguir ler. Então, vamos ver como podemos fazer?
Alterando a fonte
Antes de tudo, se você não sabe de qual mensagem de erro eu estou falando, ela é aquela mensagem que aparece dentro do próprio controle do Report Viewer quando algo está errado. Para reproduzir esse cenário, simplesmente adicione um controle do Report Viewer no seu formulário e execute a aplicação. Dessa forma, uma mensagem de erro será exibida falando que a definição do relatório não foi especificada:
The source of the report definition has not been specified
E como é que conseguimos alterar a fonte dessa mensagem de erro? Simples, altere a propriedade “Font” do controle do Report Viewer!
Isso fará com que essa nova fonte seja utilizada na mensagem de erro do relatório:
Não se preocupe, as fontes do seu relatório em si não serão alteradas (o Report Viewer obedecerá o que estiver configurado na definição do relatório). Somente a fonte dessa mensagem de erro é que será alterada.
Exibindo uma MessageBox com o erro
Uma alternativa que o Bruno Maestro tinha encontrado foi mostrar uma MessageBox com a mensagem de erro, ao invés de deixar a mensagem de erro ser exibida pelo controle do Report Viewer. Como podemos fazer isso? Simples, é só utilizar o evento ReportError:
Como o próprio nome diz, esse evento é disparado sempre que algum erro acontece no controle do Report Viewer. E todas as informações do erro podem ser acessadas através do ReportErrorEventArgs disponibilizado por esse evento. Dessa forma, conseguimos facilmente exibir uma MessageBox com a mensagem de erro:
private void reportViewer_ReportError(object sender, Microsoft.Reporting.WinForms.ReportErrorEventArgs e) { MessageBox.Show(e.Exception.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); }
Além disso, podemos ainda utilizar a propriedade “Handled” do ReportErrorEventArgs se quisermos que a mensagem de erro seja exibida somente no nosso MessageBox (e não no controle do Report Viewer). Para isso, basta configurar essa propriedade como “true“:
private void reportViewer_ReportError(object sender, Microsoft.Reporting.WinForms.ReportErrorEventArgs e) { MessageBox.Show(e.Exception.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); e.Handled = true; }
Com isso, a mensagem de erro será exibida na nossa MessageBox e o controle do Report Viewer continuará em branco (sem a mensagem de erro):
Concluindo
Sempre devemos estar atentos à acessibilidade dos nossos aplicativos. Um formulário com fontes muito pequenas pode dificultar a vida de quem não enxerga direito ou de quem está utilizando uma resolução muito alta.
Como o controle do Report Viewer (desktop) utiliza a engine do Windows Forms, ele não é “DPI aware” e o resultado dessa deficiência é que a fonte da mensagem de erro pode acabar ficando muito pequena.
No artigo de hoje você aprendeu a contornar esse problema de duas formas. A primeira delas foi alterando a própria fonte da mensagem de erro do Report Viewer. E a segunda maneira foi exibindo a mensagem de erro em uma MessageBox.
Agora pare e pense: os seus aplicativos que utilizam o controle do Report Viewer estão rodando em monitores grandes que têm uma possibilidade de resolução alta? Caso positivo, sugiro que você dê uma revisitada nesses aplicativos para conferir se o tamanho da mensagem de erro está grande o suficiente. Me conte depois nos comentários qual foi o resultado, OK?
Por fim, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail toda semana sobre o artigo publicado e ficará sabendo também em primeira mão sobre o artigo da próxima semana, além de receber dicas “bônus” que eu só compartilho por e-mail. Inscreva-se utilizando o formulário logo abaixo.
Até a próxima!
André Lima
Photo by Pixabay used under Creative Commons
https://pixabay.com/en/error-www-internet-calculator-102075/
https://pixabay.com/en/error-cross-icon-symbol-803716/
Revisão de 2015, metas para 2016 Escondendo a tab Main Report no Crystal Reports
Bacana André!
Sabe nos dizer se existe como justificar texto no Reportviewer?
Obrigado.
Olá Vinicius, obrigado pelo comentário!
A resposta para essa pergunta vale um milhão, hein! Eu particularmente nunca tentei justificar texto no Report Viewer, mas, já percebi que várias outras pessoas têm essa mesma necessidade.. Esse tema está na minha lista de tópicos para o futuro..
Os links que eu guardei da época em que eu pesquisei sobre esse tema foram:
Full justification in reporting services 2008 needed
Readme_Custom Report Item Sample
ReportViewer-Justify-TextBox
Ainda não investiguei eles a fundo, mas, pode ser que te ajudem..
E assim que eu conseguir escrever sobre esse tema, eu volto aqui e posto o link nesse comentário..
Abraço!
André Lima
Andre Boa tarde , seu Blog é bem atrativo e interessante , aprendi muito lendo seus artigos .
Queria tirar uma duvida , estou trabalhando em um projeto e queria saber como faço para criar um método , para o cliente cadastrado , quando for recuperar senha , enviar direto para o E-mail dele o E-mail e senha ?
Olá Jonas, obrigado pelo comentário!
Isso depende muito de como você implementou a estratégia de login.. Você criou por conta ou utilizou alguma biblioteca pronta?
Basicamente, você só precisa recuperar a senha do banco de dados e enviar para ele.. Para saber mais sobre envio de e-mails, eu já escrevi um artigo sobre isso uns tempos atrás:
Enviando e-mails com C#
Se isso não te ajudar, dê maiores detalhes de como você implementou a sistemática de login no seu sistema..
Abraço!
André Lima
Oi Andre Boa noite , obrigado pela sua atenção e resposta.
Meu método esta assim .
protected void btnRecuperaSenha_Click(object sender, EventArgs e)
{
CLIENTE cliente = new CLIENTE();
ClienteBLL clientebll = new ClienteBLL();
if (txtEmail.Text != “”)
{
if (clientebll.VerificarExistenciaCliente(txtEmail.Text.Trim()))
{
cliente = clientebll.RecuperaSenhaCliente(txtEmail.Text.Trim());
Session.Add(“cliente”, cliente);
//Cliente Existe
lblMsg.Text = “Sua senha cadastrada é :” + cliente.SENHA.ToString();
lblMsg.Visible = true;
}
else
{
lblMsg.Text = “Você não se encontra cadastrado.”;
lblMsg.Visible = true;
}
}
else
{
//Cliente Existe
lblMsg.Text = “Informe seu email para buscarmos a senha.”;
lblMsg.Visible = true;
}
Olá Jonas, tudo tranquilo?
Então, se você quiser mandar um e-mail com a senha, basta você incluir a metodologia de envio logo ali no lugar onde você está setando a senha no label (lblMsg.Text = “Sua senha cadastrada é :” + cliente.SENHA.ToString()), seguindo as instruções daquele link que eu te mandei anteriormente..
Porém, não é muito legal ficar enviando senha para e-mail.. O melhor seria você criar uma senha temporária e enviar essa senha temporária para o usuário.. Com essa senha temporária ele poderia logar no sistema e alterar a senha para alguma outra senha que ele quiser utilizar..
Abraço!
André Lima
Muito bom mesmo, Parabéns..
Olá Jorge, obrigado pelo comentário!
Que bom que você gostou do artigo.. Fico feliz!
Abraço!
André Lima
Como sempre bem objetivo. Parabéns André pelo excelente trabalho.
Olá Bruno! Muito obrigado por ter dado uma olhada no artigo e valeu pelo comentário!
Abraço!
André Lima