Usuário com melhor resposta
Dúvida Máscara DataGridView

Pergunta
-
Gostaria de utilizar máscara no DatagridView, achei este código aqui no fórum que permite apenas números no grid, mas gostaria de fazer isso apenas em uma coluna, e também gostaria de utilizar outras máscaras como valor decimal, moeda e data. Alguém poderia me salvar?
private void grid1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (e.Control is DataGridViewTextBoxEditingControl) { e.Control.KeyPress += new KeyPressEventHandler(Control_KeyPress); } } void Control_KeyPress(object sender, KeyPressEventArgs e) { if (!char.IsNumber(e.KeyChar)) e.Handled = true; }
Utilizo Windows Form e o método DefaultCellStyle não funciona para quando preciso editar a linha do grid, funciona apenas quando vai exibir os dados.
Respostas
-
Consegui resolver da seguinte maneira, dentro do evento "dataGridView_EditingControlShowing" eu chamo o evento "Control_KeyPress", nele eu trato as máscaras.
public partial class GRID_mask : Form { public GRID_mask() { InitializeComponent(); dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView_EditingControlShowing); } private void GRID_mask_Load(object sender, EventArgs e) { formataGridView(); } private void formataGridView() { //PARA PROIBIR DE SER DIGITAO OUTROS CARACTERES ISSO NÃO FUNCIONA, DEPOIS VOU TESTAR SE ISSO AJUDA NA HORA DE LISTAR DO BANCO //dataGridView1.Columns[0].ValueType = typeof(Int32); //dataGridView1.Columns[0].DefaultCellStyle.Format = "N0"; //AQUI PODERIA USAR Double TAMBÉM, ENTÃO NÃO SERIA NECESSÁRIO TRATAR O MaxInputLength, PORÉM PODERIA TER PROBLEMA AO SALVAR NO BANCO dataGridView1.Columns[1].ValueType = typeof(Decimal); dataGridView1.Columns[1].DefaultCellStyle.Format = "N2"; //LIMITAR CÉLULA DA COLUNA PARA ACEITAR NO MÁXIMO xxx CARACTERES ((DataGridViewTextBoxColumn)dataGridView1.Columns[1]).MaxInputLength = 29; //NÃO CONSEGUI DESENVOLVER MÁSCARA DE DATA, TENTEI VÁRIAS MANEIRAS MAS NÃO DEU MUITO CERTO //dataGridView1.Columns[2].ValueType = typeof(DateTime); //dataGridView1.Columns[2].DefaultCellStyle.Format = "d"; } private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (e.Control is DataGridViewTextBoxEditingControl) { e.Control.KeyPress += new KeyPressEventHandler(Control_KeyPress); } } private void Control_KeyPress(object sender, KeyPressEventArgs e) { int col = dataGridView1.CurrentCell.ColumnIndex; if (col == 0) {//COLUNA 0 É O CÓDIGO PARA SER UTILIZADO QUANDO QUISER TRATAR NÚMEROS INTEIROS if (!char.IsNumber(e.KeyChar)) e.Handled = true; } else if (col == 1) {//COLUNA 2 É O CÓDIGO UTILIZADO PARA VALOR DECIMAL, NESSE CASO PRECISA UTILIZAR O CÓDIGO EM formataGridView if (!char.IsNumber(e.KeyChar)) { if (!char.IsControl(e.KeyChar)) { if (!dataGridView1.CurrentCell.EditedFormattedValue.ToString().Contains(",") && (e.KeyChar == '.' || e.KeyChar == ',')) { e.KeyChar = ','; } else { e.Handled = true; } } } } else if (col == 2) { //AINDA NÃO DESENVOLVI UM MÉTODO PARA DATA } } }
No meu exemplo eu considero a coluna 0 como inteiro e a coluna 1 como valor decimal, basta alterar o número da coluna correspondente no seu projeto.
Tentei algumas formas para data mas não consegui. Se alguém souber pode me enviar. Espero ajudar alguém, já pesquisei muito e nunca achei nada sobre isso.
- Marcado como Resposta Pancamo06 quinta-feira, 17 de maio de 2018 14:45
Todas as Respostas
-
Vc pode criar uma rotina para formatação e chamar sempre que desejar, algo assim:
private void formataGrid2() { dgvResultados.Columns[0].HeaderText = "IDLIGACAO"; dgvResultados.Columns[1].HeaderText = "IDDUPLICAT"; dgvResultados.Columns[2].HeaderText = "NOTA"; dgvResultados.Columns[3].HeaderText = "DATA CRÉDITO"; dgvResultados.Columns[4].HeaderText = "VALOR TÍTULO"; dgvResultados.Columns[5].HeaderText = "VALOR JUROS"; dgvResultados.Columns[6].HeaderText = "VALOR PAGO"; dgvResultados.Columns[7].HeaderText = "VALOR ACRÉSCIMOS"; dgvResultados.Columns[8].HeaderText = "DATA BAIXA"; dgvResultados.Columns[9].HeaderText = "DATA ARQUIVO"; dgvResultados.Columns[10].HeaderText = "NOME ARQUIVO"; //Não exibe as colunas abaixo dgvResultados.Columns[0].Visible = false; dgvResultados.Columns[3].Visible = false; dgvResultados.Columns[6].Visible = false; //Alterna cor das linhas dgvResultados.AlternatingRowsDefaultCellStyle.BackColor = Color.LightBlue; // Color.LightGray; //Define alinhamento dgvResultados.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dgvResultados.Columns[8].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dgvResultados.Columns[9].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dgvResultados.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; dgvResultados.Columns[5].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; dgvResultados.Columns[6].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; dgvResultados.Columns[7].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; //Formata o campo com a quantidade de números abaixo dgvResultados.Columns[2].DefaultCellStyle.Format = "0000000000"; //Formata data dgvResultados.Columns[3].DefaultCellStyle.Format = "d"; //Formata Moeda dgvResultados.Columns[4].DefaultCellStyle.Format = "C2"; dgvResultados.Columns[5].DefaultCellStyle.Format = "C2"; dgvResultados.Columns[6].DefaultCellStyle.Format = "C2"; dgvResultados.Columns[7].DefaultCellStyle.Format = "C2"; dgvResultados.Columns[8].DefaultCellStyle.Format = "d"; dgvResultados.Columns[9].DefaultCellStyle.Format = "d"; }
-
-
Consegui resolver da seguinte maneira, dentro do evento "dataGridView_EditingControlShowing" eu chamo o evento "Control_KeyPress", nele eu trato as máscaras.
public partial class GRID_mask : Form { public GRID_mask() { InitializeComponent(); dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView_EditingControlShowing); } private void GRID_mask_Load(object sender, EventArgs e) { formataGridView(); } private void formataGridView() { //PARA PROIBIR DE SER DIGITAO OUTROS CARACTERES ISSO NÃO FUNCIONA, DEPOIS VOU TESTAR SE ISSO AJUDA NA HORA DE LISTAR DO BANCO //dataGridView1.Columns[0].ValueType = typeof(Int32); //dataGridView1.Columns[0].DefaultCellStyle.Format = "N0"; //AQUI PODERIA USAR Double TAMBÉM, ENTÃO NÃO SERIA NECESSÁRIO TRATAR O MaxInputLength, PORÉM PODERIA TER PROBLEMA AO SALVAR NO BANCO dataGridView1.Columns[1].ValueType = typeof(Decimal); dataGridView1.Columns[1].DefaultCellStyle.Format = "N2"; //LIMITAR CÉLULA DA COLUNA PARA ACEITAR NO MÁXIMO xxx CARACTERES ((DataGridViewTextBoxColumn)dataGridView1.Columns[1]).MaxInputLength = 29; //NÃO CONSEGUI DESENVOLVER MÁSCARA DE DATA, TENTEI VÁRIAS MANEIRAS MAS NÃO DEU MUITO CERTO //dataGridView1.Columns[2].ValueType = typeof(DateTime); //dataGridView1.Columns[2].DefaultCellStyle.Format = "d"; } private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (e.Control is DataGridViewTextBoxEditingControl) { e.Control.KeyPress += new KeyPressEventHandler(Control_KeyPress); } } private void Control_KeyPress(object sender, KeyPressEventArgs e) { int col = dataGridView1.CurrentCell.ColumnIndex; if (col == 0) {//COLUNA 0 É O CÓDIGO PARA SER UTILIZADO QUANDO QUISER TRATAR NÚMEROS INTEIROS if (!char.IsNumber(e.KeyChar)) e.Handled = true; } else if (col == 1) {//COLUNA 2 É O CÓDIGO UTILIZADO PARA VALOR DECIMAL, NESSE CASO PRECISA UTILIZAR O CÓDIGO EM formataGridView if (!char.IsNumber(e.KeyChar)) { if (!char.IsControl(e.KeyChar)) { if (!dataGridView1.CurrentCell.EditedFormattedValue.ToString().Contains(",") && (e.KeyChar == '.' || e.KeyChar == ',')) { e.KeyChar = ','; } else { e.Handled = true; } } } } else if (col == 2) { //AINDA NÃO DESENVOLVI UM MÉTODO PARA DATA } } }
No meu exemplo eu considero a coluna 0 como inteiro e a coluna 1 como valor decimal, basta alterar o número da coluna correspondente no seu projeto.
Tentei algumas formas para data mas não consegui. Se alguém souber pode me enviar. Espero ajudar alguém, já pesquisei muito e nunca achei nada sobre isso.
- Marcado como Resposta Pancamo06 quinta-feira, 17 de maio de 2018 14:45