Estou preenchendo um controle DataGridView em um Windows Form (C # 2.0 não WPF).
Meu objetivo é exibir uma grade que preencha perfeitamente toda a largura disponível com células - ou seja, sem áreas não utilizadas (cinza escuro) à direita e dimensiona cada coluna apropriadamente de acordo com os dados que ela contém, mas também permite ao usuário redimensionar qualquer uma das colunas ao seu gosto.
Estou tentando fazer isso definindo o AutoSizeMode de cada coluna como DataGridViewAutoSizeColumnMode.AllCells, exceto por uma das colunas que defini como DataGridViewAutoSizeColumnMode.Fill para garantir que toda a área da grade seja perfeitamente preenchida com dados. (Não me importo que quando o usuário tenta redimensionar esta coluna ela volta para um tamanho que garante que o espaço horizontal seja sempre usado.)
No entanto, como mencionei, uma vez carregado, gostaria de permitir que o usuário redimensione as colunas de acordo com seus próprios requisitos - ao definir esses valores de AutoSizeMode para cada coluna, parece que o usuário não consegue redimensionar essas colunas.
Eu tentei não definir o AutoSizeMode de todas as colunas, o que permite o redimensionamento, mas não define o tamanho inicial de acordo com os dados que as células contêm. O mesmo resultado ocorre ao alterar o AutoSizeMode da grade de volta para "Not Set" após carregar os dados.
Existe uma configuração que estou faltando aqui que permite a configuração automática de larguras de coluna padrão E redimensionamento do usuário ou há outra técnica que devo usar ao preencher o controle DataGridView?
fonte
Respostas:
Este truque funciona para mim:
O que acontece aqui é que você configura o tamanho automático para o modo que você precisa e, em seguida, coluna por coluna, você armazena a largura obtida no cálculo do tamanho automático, remove o dimensionamento automático e define a largura para o valor armazenado antes.
fonte
grd.Columns(i).Width = grd.Columns(i).Width
já funcionará. Veja aqui .dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
Talvez você pudesse ligar
Depois de definir a fonte de dados. Irá definir a largura e permitir o redimensionamento.
Mais sobre MSDN DataGridView.AutoResizeColumns Method (DataGridViewAutoSizeColumnsMode) .
fonte
DataGridViewAutoSizeColumnsMode.DisplayedCells
. Além disso, no Forms Designer, o AutoSizeColumnsMode é definido como Nenhum. Eu precisava executar essa chamada de método no manipulador de eventos DataBindingComplete de DataGridView, para garantir que ele sempre (re) dimensionasse corretamente.Versão AC # do código de Miroslav Zadravec
Postado como Community Wiki para não roubar a reputação de terceiros
fonte
Em meu aplicativo eu configurei
Além disso, eu configurei o
Agora, as larguras das colunas podem ser alteradas e as colunas podem ser reorganizadas pelo usuário. Isso funciona muito bem para mim.
Talvez isso funcione para você.
fonte
Depois de adicionar os dados à grade adicione o seguinte código que irá ajustar a coluna de acordo com o comprimento dos dados em cada célula
Aqui está o resultado
fonte
Bem, eu fiz assim:
nessa ordem particular. As colunas são redimensionadas (estendidas) E o usuário pode redimensionar as colunas posteriormente.
fonte
Se entendi a pergunta corretamente, deve haver uma maneira mais fácil de realizar o que você precisa. Ligar
dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
Isso deve funcionar. No entanto, há uma armadilha, pois você não pode simplesmente chamar esse método diretamente após preencher seu controle DataGridView. Em vez disso, você terá que adicionar um EventHandler para o evento VisibleChanged e chamar o método lá.
fonte
Duas linhas de código simples funcionam para mim.
fonte
Resumo da pergunta:
adapte a largura da coluna ao conteúdo (com métodos diferentes na coluna),
mas permita que o usuário defina a largura da coluna ...
Desenvolvendo a partir da resposta de Miroslav Zadravec , para mim o que funcionou imediatamente foi usar o auto computado
column.Width
para definir ...column.Width
!Isso é testado para funcionar quando o
DataGridView
já está criado, usando um truque como este .fonte
Isso fez maravilhas para mim:
fonte
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
Isso ajusta automaticamente todas as colunas de acordo com seu conteúdo, preenche o espaço vazio restante ao esticar uma coluna especificada e evita o comportamento de 'salto', definindo a última coluna para preencher para qualquer redimensionamento futuro.
fonte
Código C # ligeiramente mais puro do código de Miroslav Zadravec, assumindo que todas as colunas devem ser dimensionadas automaticamente
fonte
Outra versão do código de Miroslav Zadravec, mas um pouco mais automatizada e universal:
Eu coloquei a segunda parte em um evento separado, porque eu preencho a
datagridvew
inicialização do formulário e se ambas as partes estão lá, nada muda, porque provavelmente autosize calcula larguras depois dedatagridview
ser exibido, então as larguras ainda são padrão noForm1()
método. Depois de terminar este método, autosize faz seu truque e imediatamente depois disso (quando o formulário é mostrado), podemos definir as larguras pela segunda parte do código (aqui noForm1Shown
evento). Isso está funcionando para mim como um encanto.fonte
Aqui está um código simplificado para a resposta de Miroslav Zadravec em c #:
fonte
Você tentou configurar a
FillWeight
propriedade do seuDataGridViewColumns
objeto?Por exemplo:
Acho que deve funcionar no seu caso.
fonte
Uma pequena melhoria da versão de Schnapple
fonte
dataGridView1.AutoResizeColumns ();
fonte
As larguras das colunas definidas para caber no seu conteúdo Usei a declaração abaixo, Isso resolveu meu problema.
Primeiro passo :
Segundo passo :
Terceiro passo :
fonte
Isso deve funcionar se o
dataGridView
tenha sido exibido ou não (ou seja, mesmo se chamado a partir do construtor da classe).O mesmo método, mas com
DataGridViewAutoSizeColumnMode.DisplayedCells
, falha no caso acima pela razão óbvia - nenhuma célula foi exibida ainda! Por alguma razão não óbvia,AutoResizeColumns
também falha neste caso.fonte
Se você vincular sua fonte de dados a uma tabela de dados, por exemplo, será necessário definir as propriedades após a vinculação:
fonte
DataGridView.Columns
, mudeAutoSizeMode
para um válido, colete o valor da largura e defina-o de volta após mudarAutoSizeMode
paraDataGridViewAutoSizeColumnMode.None
).Form.Show()
ouForm.ShowDialog()
. Então, coloquei esse trecho de código noForm.Shown
evento e isso funciona para mim.Meu código transformado, independentemente de qualquer
DataGridView.AutoSizeColumnsMode
configuração anterior, eu uso emDataGridViewColumn.GetPreferredWidth()
vez de alterarDataGridViewColumn.AutoSizeMode
e definir o valor da largura imediatamente, em seguida, alteroDataGridView.AutoSizeColumnsMode
uma vez:Certifique-se de definir
Não sei como isso só funciona depois que o formulário é mostrado.
fonte
Tive que fazer isso em VB e prefiro dividir em um método que coloquei em um Módulo. Você pode adicionar a coluna Preencher como outro parâmetro ByRef, se desejar.
fonte
Você poderia fazer algo assim:
Todas as colunas se adaptarão ao conteúdo, exceto a última que preencherá a grade.
fonte
Com $ array sendo o conteúdo de um PSCustomObject, isso funciona:
fonte