none
Mascara para dataGridView. Como eu crio uma mas cara para aceitar somente números ou letras ? RRS feed

  • Pergunta

  • ola tenho um gird e em determinada coluna eu queria que só entra-se letras e em outra somente números. 

    alguém poderia me ajudar.

    quarta-feira, 28 de agosto de 2013 14:05

Todas as Respostas

  • Olá Guilherme,

    Você pode atribuir um evento chamado KeyPress neste campo e validar o valor digitado, veja:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                DataTable dt = new DataTable();
    
                dt.Columns.Add("Nome", typeof(string));
    
                dt.Rows.Add("Vitor");
               
                //Popula DataGridView com dados ta tabela Produtos
                dataGridView1.DataSource = dt;
    
                // Adicioma Coluna no DataGridView            
                dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
    
                dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing;
            }
    
    
            void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                if (dataGridView1.CurrentCell.ColumnIndex == 1) //Validando se é a coluna que pode digitar algo
                {
                    TextBox txtbox = e.Control as TextBox;
    
                    if (txtbox != null)
                    {
                        txtbox.KeyPress += new KeyPressEventHandler(txtbox_KeyPress);
                    }
                }
            }
    
            void txtbox_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (ValidarTextoNumero(e.KeyChar.ToString()))
                {
                    e.Handled = true;
                }
            }
    
            bool ValidarTextoNumero(string valor)
            {
                return valor.Any(r => !char.IsLetterOrDigit(r));
            }
        }
    }


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    quarta-feira, 28 de agosto de 2013 14:27
  • então eu pensei em usar o keypress mas não da rola pq os dados são colocados diretamente no datagrid, eu acho que o evento nem eh disparado eu tava vendo aki acho que posso fazer essa verificação pelo evento dataGridView1_CellEndEdit, mas não sei como.
    quarta-feira, 28 de agosto de 2013 14:40
  • Você pode usar o evento DataBindingComplete.
    quarta-feira, 28 de agosto de 2013 15:23
  • mas como ?
    quarta-feira, 28 de agosto de 2013 16:07
  • Vitor Mendes esse seu modo nao esta funcionando eu, eu acho que entendi como vc faz mas acho que nem chega a ativar o evento

    quarta-feira, 28 de agosto de 2013 16:10
  • Olá Guilherme,

    É só você atribuir no evento EditingControlShowing no DataGridView, você conseguiu fazer isso ?

    dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing;


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    quarta-feira, 28 de agosto de 2013 17:11
  • ahhh seu cogido bloqueia somente os cacorraquites especiais neh ? 

     eu queia uma coisa diferente tipo 

    na coluna um só seria permitido a entrada de letras. números e caracteres especiais nao entrariam.

    e na coluna 2 só seria permitido a entrada de números . letras e caracteres especiais nao entrariam.

    quarta-feira, 28 de agosto de 2013 18:05
  • Olá Guilherme,

    É só alterar a logica para validar de acordo com a coluna que você quiser:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                DataTable dt = new DataTable();
    
                dt.Columns.Add("Nome", typeof(string));
    
                dt.Rows.Add("Vitor");
    
                //Popula DataGridView com dados ta tabela Produtos
                dataGridView1.DataSource = dt;
    
                // Adicioma Coluna no DataGridView            
                dataGridView1.Columns.Add(new DataGridViewTextBoxColumn()); //Coluna apenas texto
                dataGridView1.Columns.Add(new DataGridViewTextBoxColumn()); //Coluna apenas numero
    
                dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing;
            }
    
    
            void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                if (dataGridView1.CurrentCell.ColumnIndex == 1) //Apenas numero
                {
                    TextBox txtbox = e.Control as TextBox;
    
                    if (txtbox != null)
                    {
                        txtbox.KeyPress += new KeyPressEventHandler(txtBoxNumero_KeyPress);
                    }
                }
                else if (dataGridView1.CurrentCell.ColumnIndex == 2) //Apenas texto
                {
                    TextBox txtbox = e.Control as TextBox;
    
                    if (txtbox != null)
                    {
                        txtbox.KeyPress += new KeyPressEventHandler(txtBoxTexto_KeyPress);
                    }
                }
            }
    
            void txtBoxNumero_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (ValidarNumero(e.KeyChar.ToString()))
                {
                    e.Handled = true;
                }
            }
    
            void txtBoxTexto_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (ValidarTexto(e.KeyChar.ToString()))
                {
                    e.Handled = true;
                }
            }
    
            bool ValidarTexto(string valor)
            {
                return valor.Any(r => !char.IsLetter(r));
            }
    
            bool ValidarNumero(string valor)
            {
                return valor.Any(r => !char.IsDigit(r));
            }
        }
    }


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    quarta-feira, 28 de agosto de 2013 18:56
  • sim sim, eu cheguei ate cheguei a mudar a logica para esta que vc mostrou agora mas ela não esta funcionando direito ainda. 

    o problema o seguinte. a primeira célula que entro funciona perfeitamente, se for a de letras ela trava os números e vise versa, o problema ocorre quando mudo de célula não sei pq mas ele adota o bloqueio para as duas não deixando eu escrever nada. 

    quinta-feira, 29 de agosto de 2013 12:41
  • acabei mudando de logica, estou entrando com os calores vias textbox ai fica mais fácil de tratar.
    quinta-feira, 29 de agosto de 2013 18:47