FORMATAR DADO COM ATRIBUTO

PERCIFILHO 05/07/2016 14:02:49
#464493
Boa tarde, meus amigos.
Estou preenchendo um DataGridView com os dados de uma classe e existe uma coluna onde tem um valor monetário.
Na tabela o dados é gravado, por exemplo, assim: 1205,00.
Gostaria que ao aparecer na grid, mostrasse assim: 1.205,00.
Estou tentando usar com o atributo DisplayFormat do System.ComponenteModel.DataAnnotations no objeto, dessa forma:
[c]private string _saldoInicial;
[Browsable(true)]
[DisplayName([Ô]Saldo Inicial[Ô])] // 10
[DisplayFormat(DataFormatString = [Ô]{0:###,##0.00}[Ô])]
[DataObjectField(false, false, true)]
public string SaldoInicial
{
get { return _saldoInicial; }
set { _saldoInicial = value; }
}/c]
mas não está dando certo, creio que a formatação está errada, alguém poderia me ajudar?
KURTGU 05/07/2016 15:43:53
#464498
Não sei se te ajuda mais....

COM CIFRAO R$ 1.000,00
Dim DEC As Decimal = TextBox1.Text
MsgBox(DEC.ToString([Ô]C[Ô]))

SEM CIFRAO 1.000,00

Dim DEC As Decimal = TextBox1.Text
MsgBox(DEC.ToString([Ô]N[Ô]))
GUIMORAES 05/07/2016 15:53:56
#464499
Resposta escolhida
Então, a sua declaração está como string, e você está retornando um número, que pode ser double ou decimal.

  

public string SaldoInicial
{
get { return _saldoInicial; }
set { _saldoInicial = value; }
}




Tenta fazer da seguinte forma.

  

public decimal saldoInicial {get;set;}

PERCIFILHO 05/07/2016 16:24:00
#464501
Colega Guimoraes123, alterei para Decimal e o resultado foi o mesmo. Com Double também, não altera nada.
Veja como está sendo exibido no DataGridView o campo Saldo Inicial.



Creio que eu deva utilizar algum atributo para formatar o objeto antes de exibir, mas não estou sabendo como fazer isso.
KURTGU 05/07/2016 17:33:29
#464503
Citação:

:
Colega Guimoraes123, alterei para Decimal e o resultado foi o mesmo. Com Double também, não altera nada.
Veja como está sendo exibido no DataGridView o campo Saldo Inicial.



Creio que eu deva utilizar algum atributo para formatar o objeto antes de exibir, mas não estou sabendo como fazer isso.



Tentou formartar da forma que passei? só por curiosidade kkk ?
KERPLUNK 05/07/2016 17:55:13
#464506
Essa anotação não é consultada para o componente DataGridView do windows forms. De acordo com a documentação, ela é usada para DataGridView do ASP.NET. Mas é possível contornar isso. O DataGridView do windows forms, pode receber outros objetos que por Reflection podem verificar essa decoração e formatar os dados na coluna conforme você espera. é algo de nível intermediário, não muito difícil de ser implementado e existem dezenas de exemplos na Web para isso.
PERCIFILHO 06/07/2016 08:45:35
#464532
Kurtgu,
Citação:

Tentou formartar da forma que passei? só por curiosidade kkk ?


Dessa meneira não dá certo.

Kerplunk,
Citação:

O DataGridView do windows forms, pode receber outros objetos que por Reflection podem verificar essa decoração e formatar os dados na coluna conforme você espera


Se tivesse algum exemplo para me mostrar, agradeceria, pois procurei muito na Web e não encontrei nada que me ajudasse.
O que eu queria era algo do tipo, colocar um atributo ou decoração no objeto da classe, assim quando eu vinculasse os dados da classe ao DataGridView com o DataSource, não precisaria me preocupar em saber qual é a coluna que eu tenho que formatar, entendeu? Provisoriamente eu resolvi o problema assim:
// criando uma List<> com os dados;
List<Banco> _bancos = new List<Banco>(new Banco().GetAll().Where(x => x.Conta.Contains(txtOcorrencia.Text)).OrderBy(x => x.Nome));
// se não encontrar registros, mostra a mensagem, senão, vincula os dados ao DataGridView;
if (_bancos.Count == 0)
{
lblRegistros.Text = [Ô]Nenhum registro encontrado[Ô];
MessageBox.Show([Ô]Nenhum registro para exibir[Ô], [Ô]Nenhum registro[Ô], MessageBoxButtons.OK, MessageBoxIcon.Information);
dgv.DataSource = null;
return;
}
dgv.DataSource = _bancos;
}
// exibe a quantidade de registros encontrados;
if (dgv.RowCount > 1) lblRegistros.Text = dgv.RowCount.ToString() + [Ô] registros encontrados[Ô];
else lblRegistros.Text = dgv.RowCount.ToString() + [Ô] registro encontrado[Ô];
// formatando a coluna do saldo inicial (coluna 4);
dgv.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dgv.Columns[4].DefaultCellStyle.Format = [Ô]###,##0.00[Ô];

Funcionou, porém se amanhã ou depois eu tiver que incluir mais algumas colunas na grid, ou mesmo, alterar a ordem das colunas exibidas, eu teria que modificar o código e verificar qual o número da coluna a ser formatada corretamente, e é justamente isso que eu não gostaria de ter que fazer, entendeu?
Agradeço se puder me ajudar.
GUIMORAES 06/07/2016 09:13:59
#464533
PERCIFILHO,

Fiz um teste aqui, e realmente a formatação da coluna não se aplica ao datagridview do windows forms.
Uma forma de fazer isto é formatando o valor no get.

  

private string _valor;
[DisplayName([Ô]Saldo Inicial[Ô])]
public string valor {
get { return Convert.ToDouble(_valor).ToString([Ô]N2[Ô]); }
set { _valor = value; }
}

PERCIFILHO 06/07/2016 09:36:48
#464534
GUIMORAES123, tentei fazer a formatação no get, porém ocorreu uma exceção ao abrir o formulário:
{[Ô]Exception of type [ô]System.StackOverflowException[ô] was thrown.[Ô]}
GUIMORAES 06/07/2016 09:49:06
#464535
Fiz um exemplo de como deve ficar
PERCIFILHO 06/07/2016 12:05:32
#464547
Realmente, funcionou Gui, acho que eu tinha feito algo errado, agora testei e funcionou.
Muito obrigado pela ajuda. Até mais.
Tópico encerrado , respostas não são mais permitidas