Автоматическое изменение размера элемента treeview после свертывания

#c# #winforms #treeview #collapse

#c# #winforms #treeview

Вопрос:

Я ищу способ установить ширину treeview либо на максимальную, либо на размер самого длинного treenode в нем, всякий раз, когда узел сворачивается или открывается.

Я пробовал использовать clientsize, но, похоже, это не работает. Есть ли другой способ проверить, какой узел является самым длинным, и установить TreeView.Ширина до такого размера?

Комментарии:

1. Почему бы просто не сделать то, что делает оболочка Windows сейчас, и автоматически прокручивать TreeView по горизонтали в зависимости от выбранного элемента и положения курсора мыши? Я не думаю, что это действительно хорошая идея динамически изменять размер элементов управления; это может сильно дезориентировать пользователей.

2. Ты говоришь правду, я никогда не утверждал, что этот проект будет для всеобщего обозрения.

3. Хорошо …? Я не уверен, почему это менее верно для вас, чем было бы для всех остальных. Но как бы то ни было; вы имеете право создавать свое приложение так, как я хочу, вот почему я опубликовал это как комментарий, а не как ответ. Еще одна причина сделать это так, как я предложил, заключается в том, что нет особенно простого способа сделать то, что вы просите. Элемент управления TreeView не имеет AutoSize свойства по какой-то причине. Вам придется обойти узлы, проверить длину, определить, какой из них самый длинный, а затем вычислить размер элемента управления, необходимый для размещения самой длинной строки узла.

4. Работал над этим, но у меня не получилось. Все на борт failboat! Основываясь на вашем комментарии, я изменил свой метод на интерактивный для пользователя вместо автоматического. что означало бы, что когда пользователь нажимает на определенное место, я хочу, чтобы элемент управления изменял размер автоматически. Правильным способом было бы обойти узлы. Пожалуйста, опубликуйте это в качестве ответа, чтобы я мог принять его, если пока нет лучшего

Ответ №1:

После еще нескольких поисков в сети я нашел этот способ:

 private const int GWL_STYLE = -16;
private const int WS_VSCROLL = 0x00200000;
private const int WS_HSCROLL = 0x00100000;


[DllImport("user32.dll", ExactSpelling = false, CharSet = CharSet.Auto)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
  

и:

 //tree = instance of a treeview
tree.AfterExpand  = (s, ea) =>
{
    int style = GetWindowLong(tree.Handle, GWL_STYLE);
    while ((style amp; WS_HSCROLL) != 0)
    {
        tree.Width  ;
        style = GetWindowLong(tree.Handle, GWL_STYLE);
    }
};
  

Конечно, вы можете использовать это и для кнопки!