Pergunta

Eu estou tendo alguns problemas com um elemento datagridview que estou usando no VS2008. Este DataGridView é realmente um guia em um elemento TabControl.

Eu dei-lhe 5 colums que precisam ser preenchidos com elementos de um objeto costum eu fiz.

É basicamente uma aplicação pequena biblioteca que contém uma classe principal e vários classificada derivada dela. Todos eles têm um método ToString (), que representa os dados como uma série de palavras-chave que contêm os valores necessários para me encher o datagridview.

Eu só preciso a primeira 5, porém, alguns objetos terão até 12 palavras-chave. Atualmente, Sempre que eu adicionar um objeto, o datagrid não encher-se, em vez disso, acrescenta uma quantidade de colunas equall à quantidade de palavras-chave do objeto específico tem.

O que eu estou fazendo atualmente é o seguinte:

public void libDataGrid_Click(object sender, EventArgs e)
        {
            if(this.manager.Lib.LibList[0] != null)
            {
                libDataGrid.DataSource = this.manager.Lib.LibList;
                libDataGrid.Refresh();
            }
        }

retornos this.manager.Lib.LibList e ArrayList, em que todos os objetos são armazenados. O ArrayList pode conter elementos de todas as classes derivadas, mas uma vez que eles estão todos conectados, a representação de cadeia sempre conterá os elementos que eu preciso para preencher a grade.

Não vejo como posso filtrar apenas os cinco primeiros e eles tê-los colocado nas colums corretas.

E outra coisa. Atualmente eu só pode atualizar o DataGridView clicando nele. Deve mudar quando eu mudar para ele mudar para sua guia específico sobre a média tabcontrol I.

Eu tentei adicionar um argumento para SelectedIndexChanged, mas que não faz nada realmente ... Ou pelo menos, não parece fazer nada.

O que quero dizer é que eu comentei o código acima e adicionado este em vez disso:

public void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
                libDataGrid.DataSource = this.manager.Lib.LibList;
                libDataGrid.Refresh();
        }

Isso atualiza-lo toda vez que o guia é alterada, não importa para qual. Eu tinha que remover a instrução if, pois me deu uma exceção. Provavelmente porque o comprimento do ArrayList não está definido na inicialização.

Foi útil?

Solução

Estou um pouco confuso com a pergunta, mas aqui estão alguns pensamentos:

  1. DataGridView tem um AutoGenerateColumns propriedade; se você não quer que ele para criar suas próprias colunas, defina como false
  2. Para vincular a colunas existentes, a DataPropertyName deve ser definida em cada
  3. DataGridView (em cmomon com qualquer controle de lista usando TypeDescriptor) será extremamente preferem List<T> (para alguns T! = object) para ArrayList, uma vez que pode obter meta-dados, mesmo para uma lista vazia. Em geral, em 2,0 usando ArrayList é um erro.

Outras dicas

Eu só posso dar uma resposta parcial, mas eu acho que a razão pela qual

public void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
                libDataGrid.DataSource = this.manager.Lib.LibList;
                libDataGrid.Refresh();
        }

não está funcionando, é porque você precisa adicionar esta linha onde TabControl1 está sendo inicializado. Eu tive esse problema em que VS não vai fazer isso em si.

tabControl1.SelectedIndexChanged += new EventHandler(tabControl1_SelectedIndexChanged);

Se eu estou entendendo o seu problema, parece semelhante a um problema que eu estava lutando com recentemente neste segmento em DataGridViews em C # /. NET2.0

Tente chamar:

libDataGrid.Invalidate();

Isso deve forçar o Windows para redesenhar seu controle. Não há necessidade de recolocar a fonte de dados e atualizar. (Eu acho que você pode comentar com segurança para fora aqueles 2 linhas).

Também:? Qual foi a excepção de que estavam recebendo

E você usar o "Assistente de Configuração de Fonte de Dados" para ajudá-lo com o dataGridView?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top