как изменить размер формы, чтобы она автоматически соответствовала ее содержанию?

<p>я пытаюсь реализовать следующее поведение:</p><p>на форме есть вкладка. на этой вкладке есть древовидная структура. чтобы предотвратить появление полос прокрутки, я бы хотел, чтобы форма меняла свой размер в соответствии с содержимым древовидной структуры при первом отображении. </p><p>если в древовидном представлении слишком много узлов, чтобы отобразить его в размере формы по умолчанию, форма должна изменить свой размер, чтобы в древовидной структуре не было вертикальной полосы прокрутки (до максимального размера, разрешенного размером экрана).</p><p>что мне нужно знать, так это то, можно ли добиться такого поведения с помощью свойств элементов управления. я уверен, что это может быть достигнуто путем расчета и настройки размеров элементов программно, но я хотел бы знать, есть ли способ добиться этого с помощью таких настроек, как autosizemode и т.д.</p><p><strong> [обновление] </strong></p><p>это первый диалог, который видит пользователь моего приложения: это диалог выбора базы данных для работы. это список баз данных с табуляцией, кнопками и т.д. если список слишком длинный, появляются полосы прокрутки, и мой коллега хочет, чтобы они исчезли.</p>

<p>используйте свойства autosize и autosizemode.</p><p> <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.form.autosize.aspx">http://msdn.microsoft.com/en-us/library/system.windows.forms.form.autosize.aspx</a> </p><p>пример:</p><pre><code>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... } </code></pre>

<p>используя различные свойства определения размера (dock, anchor) или контейнерные элементы управления (panel, tablelayoutpanel, flowlayoutpanel и т.д.), вы можете только определять размер от внешнего элемента управления до внутренних элементов управления. но в рамках .net нет ничего (работающего), которое позволяло бы определять размер контейнера через размер дочернего элемента управления. я также пропустил это несколько раз и попробовал свойство autosize, но оно никогда не работало.</p><p>так что все, что вы можете сделать, это попытаться сделать это вручную, извините.</p>

<p>от <a href="http://msdn.microsoft.com/en-us/library/ms171729.aspx">msdn</a> :</p><blockquote> <p>чтобы максимизировать производительность, конструктор windows forms затеняет свойство <code>autosize</code> для класса <code>form</code>. <strong>во время разработки</strong>, форма ведет себя так, как будто свойство <code>autosize</code> установлено в <strong>false</strong>, независимо от его фактической настройки. <strong>во время выполнения</strong>, никаких специальных размещение производится, и свойство <code>autosize</code> применяется как определяется настройкой свойства.</p> </blockquote>

<p>вы можете рассчитать требуемую высоту treeview, вычислив высоту узла, умножив ее на количество узлов, а затем соответственно установив свойство minimumsize формы.</p><pre><code>// 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); </code></pre><p>nb. это предполагает, однако, что treeview1 является единственным элементом управления в форме. при настройке переменной requiredformheight вам нужно будет учесть другие элементы управления и требования к высоте, относящиеся к древовидному представлению, например, упомянутый вами tabcontrol.</p><p><em> (тем не менее, я согласен с @jgauffin и оценил бы обоснование необходимости изменять размер формы каждый раз, когда она загружается без согласия пользователя - возможно, пусть пользователь размещает и изменяет размер формы и запоминает это вместо этого ??) </em></p>

<p>это может быть полезно .... он изменяет размеры новой формы для пользовательского элемента управления, а затем привязывает пользовательский элемент управления к новой форме:</p><pre><code>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(); </code></pre>

<p>если вы пытаетесь подогнать содержание по формам, вам поможет следующее. это помогает мне, когда я пытался подогнать содержимое формы, чтобы соответствовать размеру формы.</p><blockquote> <p>this.contents.size = new size (this.clientrectangle.width, this.clientrectangle.height);</p> </blockquote>

<p>этот метод решил мою проблему:</p><p><strong> в родительской форме: </strong></p><pre><code>frmemployee frm = new frmemployee(); frm.mdiparent = this; frm.dock = dockstyle.fill; frm.show(); </code></pre><p><strong> в дочерней форме (событие load): </strong></p><pre><code>this.windowstate = formwindowstate.maximized; </code></pre>

<p>я использовал этот код, и он отлично работает</p><pre><code>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; </code></pre>