#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);
}
};
Конечно, вы можете использовать это и для кнопки!