2009-10-22 44 views
9

Ho un modulo e un DataGridView. Popolo DataGridView in fase di esecuzione, quindi desidero sapere come ridimensionare il modulo in modo dinamico in base alle dimensioni di DataGridView? Esiste qualche tipo di proprietà o metodo? O devo determinare io stesso le dimensioni e aggiornare di conseguenza?C# Ridimensionamento automatico del modulo sulla dimensione di DataGridView

+0

Come si fa a "determinare la dimensione del me stesso" per favore? Ho solo bisogno di sapere quanti pixel "vuole" il DGV. (Posso inserire limiti ragionevoli per impedire che il modulo diventi troppo grande.) – billpg

risposta

3

Normalmente i controlli adattano le loro dimensioni alle dimensioni del modulo contenente. Per adattare la dimensione del tuo form alle dimensioni di DataGridView, devi fare per determinare la dimensione e quindi impostare le dimensioni del modulo in modo che corrispondano, ricordando di prendere in considerazione le dimensioni extra richieste dalla striscia del menu del modulo e/o barre degli strumenti, barre di stato o altri controlli.

Nel tuo caso, sarebbe probabilmente meglio non ridimensionare il modulo in modo che corrisponda al controllo della vista griglia. Molto probabilmente, nella tua griglia vedrai molte più righe di quante potrebbero essere contenute nello schermo di Windows e non vuoi avere un modulo che si estende sotto l'area del desktop visibile. In generale, questo tipo di situazione è esattamente il motivo per cui si desidera avere una visualizzazione a griglia scorrevole per visualizzare più dati di quanti possano essere contenuti sullo schermo contemporaneamente.

+2

"Per adattare le dimensioni del tuo form alle dimensioni di DataGridView, devi determinare tu stesso la dimensione" C'è un modo per farlo per favore? My DataGridView ha solo poche celle e solo in lettura. Ridimensionare il modulo per adattarlo non è affatto un problema, a parte il fatto che non conosco quanti pixel richiede il DGV. Molte grazie. – billpg

6

È possibile trovare la larghezza effettiva per conteggio Larghezza colonne.

Non dimenticare che il tuo modulo potrebbe essere più complesso e che dovresti contare su altri controlli.

public class YourForm : Form 
{ 
    public YourForm() 
    { 
     DataGridView _dgv = new DataGridView() { Dock = DockStyle.Fill}; 
     Controls.Add(_dgv); 
    } 
    public void CorrectWindowSize() 
    { 
     int width = WinObjFunctions.CountGridWidth(_dgv); 
     ClientSize = new Size(width, ClientSize.Height); 
    } 
    DataGridView _dgv; 
} 

public static class WinObjFunctions 
{ 
    public static int CountGridWidth(DataGridView dgv) 
    { 
     int width = 0; 
     foreach (DataGridViewColumn column in dgv.Columns) 
      if (column.Visible == true) 
       width += column.Width; 
     return width += 20; 
    } 
} 
1

Vorrei andare nell'altra direzione e dimensionare la griglia nel modulo. (alcuni utenti potrebbero avere delle basse ris.) Imposta la proprietà 'WindowState' del modulo => massimizzata. (facoltativo) Imposta la proprietà 'anchor' del DGV => 'Superiore, Inferiore, Sinistra, Destra'.

1

Potrebbe essere possibile utilizzare la proprietà PreferredSize (MSDN PreferredSize entry). Per i controlli DataGridView, ho trovato che la larghezza e l'altezza preferite erano circa 20 unità più grandi di quanto mi aspettassi. Immagino che il controllo potrebbe calcolare le sue dimensioni preferite tenendo conto delle barre di scorrimento.

Un'altra avvertenza che ho rilevato è che il calcolo PreferredSize non sarà accurato immediatamente dopo l'aggiunta o la modifica di elementi nella tabella. Per aggirare questo ho fatto un gestore per l'evento RowHeadersWidthChanged.

Ecco cosa ha funzionato per me:

class GridToy { 
    private DataGridView grid; 
    public GridToy(DataGridView dgv) { 
     grid = dgv; 
     grid.RowHeadersWidthChanged += AdjustWidth; // Event handler. 
     Layout(); 
    } 

    public void Layout() { 
     // Just do some arbitrary manipulation of the grid. 
     grid.TopLeftHeaderCell.Value = "Some Arbitrary Title"; 
    } 

    public void AdjustWidth() { 
     Control horizontal = grid.Controls[0]; // Horizontal scroll bar. 
     Control vertical = grid.Controls[1]; // Vertical scroll bar. 
     grid.Width = grid.PreferredSize.Width - vertical.Width + 1; 
     grid.Height = grid.PreferredSize.Height - horizontal.Height + 1; 
    } 
} 
+0

Non sono sicuro che RowHeadersWidthChanged sia l'evento migliore da ascoltare, ma sembra che il lavoro sia svolto. – amacleod

+0

Hmm. Ulteriori sperimentazioni rivelano che 'PreferredSize' prende in considerazione anche la larghezza delle intestazioni di riga, anche se' RowHeadersVisible' è false. Sembra che mettere insieme le dimensioni della somma a mano sarà più affidabile. – amacleod

-1

dataGridView1.AutoResizeColumns (DataGridViewAutoSizeColumnsMode.AllCells);

Spero che questo aiuti :)

2
int dgv_width = dataGridView1.Columns.GetColumnsWidth(DataGridViewElementStates.Visible); 
int dgv_height = dataGridView1.Rows.GetRowsHeight(DataGridViewElementStates.Visible); 
this.Width = dgv_width; 
this.Height = dgv_height; 

this.Width ridimensiona questa larghezza modulo.

Ovviamente è necessario aggiungere valori fissi (ad esempio margine, altezza titolo modulo, ecc.). Con test Ho raggiunto i valori che lavorano per me (non chiedere perché ...):

this.Width = dgv_width + 147; 
this.Height = dgv_height + 47; 
0

È possibile impostare la "Altezza" proprietà su Auto in forma dopo la classificazione o utilizzando un ID e questo dovrebbe farlo ,,

Ho appena provato ..E ha funzionato

#form1{ 
background-color:white; 
height:auto;        
width:1500px;    
border-top:medium solid #3399FF; 
margin-top:100px; 
margin-left:30px; 
display: inline-block; 
text-align: center;     
float: none;  
} 

sto solo mettendo esattamente quello che ho fatto nel caso in cui hai perso .. Non preoccuparti per le altre proprietà lì per il mio progetto.

-1

Set AutoSizeColumnsMode :Fill in Proprietà griglia

Problemi correlati