it-swarm.com.de

Wie können Sie die Größe eines Formulars ändern, damit es automatisch in den Inhalt passt?

Ich versuche folgendes Verhalten zu implementieren:

In einem Formular gibt es eine Tabulatorsteuerung. Auf dieser Registerkarte befindet sich eine Baumansicht. Um zu verhindern, dass Bildlaufleisten angezeigt werden, möchte ich, dass das Formular bei der ersten Anzeige seine Größe entsprechend dem Inhalt der Baumansicht ändert. 

Wenn die Baumansicht zu viele Knoten aufweist, um auf der Standardgröße des Formulars angezeigt zu werden, sollte das Formular seine Größe ändern, sodass in der Baumansicht keine vertikale Bildlaufleiste angezeigt wird (bis zu einer durch die Bildschirmgröße maximal zulässigen Größe).

Ich muss wissen, ob es möglich ist, dieses Verhalten durch die Eigenschaften der Steuerelemente zu erreichen. Ich bin sicher, dass dies durch das programmgesteuerte Berechnen und Einstellen der Größe der Elemente erreicht werden kann, aber ich würde gerne wissen, ob es einen Weg gibt, dies durch Einstellungen wie AutoSizeMode usw. zu erreichen.

[UPDATE]

Es ist der erste Dialog, den ein Benutzer meiner Anwendung sieht: Es ist ein Dialog, um die Datenbank auszuwählen, mit der gearbeitet werden soll. Es handelt sich um eine Liste von Datenbanken mit einem Tabulator, Untermenüs usw. Wenn die Liste zu lang ist, werden Bildlaufleisten angezeigt, und ein Kollege von mir möchte, dass sie verschwinden.

28
Inno

Verwenden Sie die Eigenschaften AutoSize und AutoSizeMode.

http://msdn.Microsoft.com/de-de/library/system.windows.forms.form.autosize.aspx

Ein Beispiel:

private void Form1_Load(object sender, EventArgs e)
{
    // no smaller than design time size
    this.MinimumSize = new System.Drawing.Size(this.Width, this.Height);

    // no larger than screen size
    this.MaximumSize = new System.Drawing.Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, (int)System.Windows.SystemParameters.PrimaryScreenHeight);

    this.AutoSize = true;
    this.AutoSizeMode = AutoSizeMode.GrowAndShrink;

    // rest of your code here...
}
26
Derek Johnson

Durch Verwenden der verschiedenen Größeneigenschaften (Dock, Anker) oder Containersteuerelemente (Panel, TableLayoutPanel, FlowLayoutPanel usw.) können Sie die Größe nur von den äußeren Steuerelementen bis zu den inneren Steuerelementen bestimmen. Es gibt jedoch (nichts) innerhalb des .NET-Frameworks, das die Größe eines Containers durch die Größe des untergeordneten Steuerelements bestimmen kann. Ich habe dies auch ein paar Mal vermisst und die AutoSize-Eigenschaft ausprobiert, aber es hat nie funktioniert.

Alles, was Sie tun können, ist zu versuchen, dieses Zeug manuell zu erledigen, sorry.

13
Oliver

Von MSDN :

Um die Produktivität zu maximieren, spiegelt der Windows Forms-Designer die AutoSize-Eigenschaft für die Form-Klasse. Zur Entwurfszeit das Formular verhält sich so, als wäre die AutoSize-Eigenschaft auf false, .__ gesetzt. unabhängig von der tatsächlichen Einstellung. Zur Laufzeit kein spezieller Es wird eine Unterkunft erstellt, und die AutoSize-Eigenschaft wird als .__ angewendet. von der Eigenschaftseinstellung angegeben.

10
serhio

Sie können die erforderliche Höhe der TreeView berechnen, indem Sie die Höhe eines Knotens ermitteln, mit der Anzahl der Knoten multiplizieren und dann die MinimumSize-Eigenschaft des Formulars entsprechend festlegen.

// assuming the treeview is populated!
nodeHeight = treeview1.Nodes[0].Bounds.Height;

this.MaximumSize = new Size(someMaximumWidth, someMaximumHeight);

int requiredFormHeight = (treeView1.GetNodeCount(true) * nodeHeight);

this.MinimumSize = new Size(this.Width, requiredFormHeight);

NB. Dies setzt jedoch voraus, dass die Baumansicht1 das einzige Steuerelement im Formular ist. Beim Festlegen der requiredFormHeight-Variablen müssen Sie andere Steuerelemente und Höhenanforderungen für die Baumansicht berücksichtigen, z. B. das von Ihnen erwähnte Tabulatorsteuerelement.

(Ich stimme jedoch @jgauffin zu und bewerte die Gründe für die Anforderung, ein Formular jedes Mal zu ändern, wenn es ohne Zustimmung des Benutzers geladen wird. Vielleicht lassen Sie den Benutzer die Position und Größe des Formulars festlegen, und merken Sie sich stattdessen.)

5
Stuart Helwig

Dies kann nützlich sein ... __ Die Größe eines neuen Formulars wird an ein Benutzersteuerelement angepasst und das Benutzersteuerelement wird dann mit dem neuen Formular verankert

Form f = new Form();
MyUserControl muc = new MyUserControl();
f.ClientSize = muc.Size;
f.Controls.Add(muc);
muc.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
f.ShowDialog();
5

Wenn Sie versuchen, den Inhalt an die Formulare anzupassen, hilft das Folgende. Es hilft mir, während ich versuchte, den Inhalt des Formulars anzupassen, wenn die Größe der Formulare geändert wurde.

this.contents.Size = neue Größe (this.ClientRectangle.Width.... this.ClientRectangle.Height);

3
Lifestohack

Diese Technik hat mein Problem gelöst:

In übergeordneter Form:

frmEmployee frm = new frmEmployee();
frm.MdiParent = this;
frm.Dock = DockStyle.Fill;
frm.Show();

Im untergeordneten Formular (Ereignis laden):

this.WindowState = FormWindowState.Maximized;
3
Phantom Lord

Ich habe diesen Code verwendet und es funktioniert gut

const int margin = 5;
        Rectangle rect = new Rectangle(
            Screen.PrimaryScreen.WorkingArea.X + margin,
            Screen.PrimaryScreen.WorkingArea.Y + margin,
            Screen.PrimaryScreen.WorkingArea.Width - 2 * margin,
            Screen.PrimaryScreen.WorkingArea.Height - 2 * (margin - 7));
        this.Bounds = rect;
0
MBARK T3ST3R

Ich benutze diesen Code in meinem Projekt, nützlich für mich.

    private void Form1_Resize(object sender, EventArgs e)
    {
        int w = MainPanel.Width; // you can use form.width when you don't use panels

        w = (w - 120)/4; // 120 because set 15px for each side of panels
                         // and put panels in FlowLayoutPanel
                         // 4 because i have 4 panel boxes
        panel1.Width = w;
        panel2.Width = w;
        panel3.Width = w;
        panel4.Width = w;
    }

enter image description here

0