none
Dúvida Máscara DataGridView RRS feed

  • 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.

    terça-feira, 15 de maio de 2018 19:24

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
    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";
            }


    terça-feira, 15 de maio de 2018 20:35
  • Interessante a ideia, não atende 100% mas já ajuda. Porém toda formatação que faço da certo menos a do
    DefaultCellStyle.Format
    será que teria que alterar alguma propriedade para desbloquear ela ou algo assim?
    quarta-feira, 16 de maio de 2018 12:33
  • 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
    quinta-feira, 17 de maio de 2018 14:45