O DATAGRIDVIEW PODE FUNCIONAR COMO O EXCEL?

 Tópico anterior Próximo tópico Novo tópico

O DATAGRIDVIEW PODE FUNCIONAR COMO O EXCEL?

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#482143 - 06/06/2018 15:06:00

MARCOS

Cadast. em:Dezembro/2003


Boa tarde,colegas!
Estou com um problema simples, mas para o qual
não encontrei solução na internet:

O problema:

Numa aplicação VB.NET ( WinForm) , tenho um DataGridView,
No qual exibo o conteúdo de uma tabela com várias colunas.
Funciona perfeito.
Meu usuário no entanto, precisa editar o valor de determinadas
células do grid. Para editar, ele quer que :

1.) Precise clicar apenas uma vez na célula, para que a célula já fique no modo de edição. ( Como acontece com o Excel )
2.) Estando numa célula,seja possível navegar para as células próximas ( Acima,abaixo,a direita e esquerda ), com o uso
     das teclas de seta, no teclado. ( Como acontece com o Excel )

Algum colega, sabe me dizer como conseguir estes comportamentos no DataGridView do .NET ?


Agradeço qualquer ajuda.
  



#482144 - 06/06/2018 15:13:37

GUIMORAES
ITAPETININGA
Cadast. em:Agosto/2009


Sim, é possível, e não demanda de nenhuma alteração para ele interpretar estas ações.



Resposta escolhida #482145 - 06/06/2018 15:14:18

CLEVERTON
SERRINHA
Cadast. em:Dezembro/2003


Membro da equipe
Citação:
1.) Precise clicar apenas uma vez na célula, para que a célula já fique no modo de edição. ( Como acontece com o Excel )


Coloque isso no construtor do seu form
           seuDGV.CellEnter += (sender, e) =>
            {
                seuDGV.CurrentCell = seuDGV[e.ColumnIndex, e.RowIndex];
                seuDGV.BeginEdit(true);
            };



#482146 - 06/06/2018 15:17:25

CLEVERTON
SERRINHA
Cadast. em:Dezembro/2003


Membro da equipe

Última edição em 06/06/2018 15:39:02 por CLEVERTON

Citação:
2.) Estando numa célula,seja possível navegar para as células próximas ( Acima,abaixo,a direita e esquerda ), com o uso
     das teclas de seta, no teclado. ( Como acontece com o Excel )


Eu particularmente prefiro interceptar as teclas sobrescrevendo o método ProcessCmdKey do form.
Vc vai ter que adequar a sua maneira, mas segue um exemplo.

Coloca esse código no seu form:

protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
        {
            if (this.ActiveControl.GetType() != typeof(DataGridViewTextBoxEditingControl)) return false;
            if (seuDGV.CurrentCell == null) return false;

            if (keyData == Keys.Enter)
            {
                try
                {
                    int rowid = seuDGV.CurrentCell.RowIndex;
                    int colid = seuDGV.CurrentCell.ColumnIndex;

                    int qtdcolunas = seuDGV.ColumnCount - 1;

                    if (colid.Equals(qtdcolunas))   /EDITADO, MODIFIQUE
                    {
                        rowid++;
                        seuDGV[0, rowid].Selected = true;
                    }
                    else
                    {
                        for (int i = 0; i < qtdcolunas; i++)
                        {
                            colid++;
                            if ((seuDGV.Columns[colid].Visible) && (seuDGV.Columns[colid].ReadOnly == false))
                            {
                                seuDGV[colid, rowid].Selected = true;
                                seuDGV.CurrentCell = seuDGV[colid, rowid];
                                seuDGV.BeginEdit(true);
                                break;
                            }
                        }
                    }

                    return true;
                }
                catch (Exception)
                {
                    seuDGV.CancelEdit();
                }
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }





#482147 - 06/06/2018 15:22:40

CLEVERTON
SERRINHA
Cadast. em:Dezembro/2003


Membro da equipe

Última edição em 06/06/2018 15:24:33 por CLEVERTON

Lembrando que o ideal é vc passar um List<T> para o BindSource para o seuDGV,DataSource,

Método de extensão, COLOCAR NUMA CLASSE ESTÁTICA
         public static BindingSource ToBindSource<T>(this T objectData)
        {
            BindingSource a = new BindingSource() { DataSource = objectData };
            return a;
        }


                     seuDGV.DataSource = null;
                        seuDGV.DataSource = listaDeProdutos.ToBindSource();




#482149 - 06/06/2018 15:40:23

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
O que você quer é totalmente possível, inclusive colocar controles específicos como um datepicker ou um combo ou qualquer outro mais  ou menos como aqui. Além disso, é quase que regra usar como o CLEVERTON mostrou, melhor ainda se o seu datasource for um objeto de contexto de dados como o entity framework, nesse caso, a gravação dos dados é automática.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por MARCOS em 08/06/2018 16:33:46