none
Máscara Datagridview RRS feed

  • Pergunta

  • Boa tarde, gostaria se alguém tiver, algum método de colocar máscara no DataGridView. Exemplos:

    1) Permitir digitar apenas números

    2) Máscara para Data

    3) Máscara para Valor

    ...

    Alguém tem alguma dica? Só acho inserções e edições no Grid através de TextBox e acho que ficaria bem melhor no sistema se já fizesse direto no grid.

    Se alguém puder ajudar ficaria muito grato, lembrando que minha aplicação esta em windows form.

    segunda-feira, 14 de maio de 2018 19:10

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:47
    quinta-feira, 17 de maio de 2018 14:47

Todas as Respostas

  • É só você ir na opção editar colunas do datagridView , selecionar a coluna desejada ir na propriedade da coluna e clicar na opção DefaultCellStyle. Irá abrir uma janela chamada criador de CellStyle (creator of CellStyle). Nesta janela vá na opção format, nessa opção você pode formatar para moeda, só números, datas e pode personalizar o campo desejado. Espero ter ajudado. Se é o que você estava procurando marque como resposta.
    • Editado Jô Alves segunda-feira, 14 de maio de 2018 20:19
    • Sugerido como Resposta Jô Alves segunda-feira, 14 de maio de 2018 20:51
    • Não Sugerido como Resposta Jô Alves segunda-feira, 14 de maio de 2018 20:51
    segunda-feira, 14 de maio de 2018 20:00
  • então, só que isso não funciona quando a pessoa vai editar a linha, só se tiver que marcar alguma opção para ele considerar isso.
    terça-feira, 15 de maio de 2018 12:07
  • 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:47
    quinta-feira, 17 de maio de 2018 14:47