Непоследовательное поведение при попытке выделить C # TextBox - PullRequest
3 голосов
/ 08 октября 2010

Я создаю программу C # WinForms, и мои текстовые поля не позволяют пользователю последовательно выделять текст по всей программе.

В некоторых местах выделение работает нормально: вы вводите что-то в поле, нажимаете и перетаскиваете текст, и оно подсвечивает место, куда вы перетаскивали.

В других местах при нажатии и перетаскивании текст не выделяется. Единственный способ сделать это - дважды щелкнуть текст.

Я не изменил никаких свойств по умолчанию для этих текстовых полей и не перепутал их с прослушивателями событий. Я разместил совершенно новые текстовые поля в разных местах, и они ведут себя по-разному.

Мне интересно, связано ли это со свойствами формы, в которой содержится TextBox, так как кажется, что либо все текстовые поля в конкретной форме работают, либо нет. Однако, насколько я могу судить, свойства выглядят одинаково по всем направлениям, и я никогда не помню, чтобы что-то менять.

Мне кажется, что это происходит случайно. Я не могу найти информацию по этой теме. Кто-нибудь знает, о чем я говорю?

РЕДАКТИРОВАТЬ: Хорошо, я выяснил, где проблема, но я все еще не знаю, как ее исправить.

Это происходит только в формах, которые были добавлены в SplitContainer в моем главном окне, например:

myForm.TopLevel = false;
this.splitContainer.Panel2.Controls.Add(myForm);
myForm.Show();

РЕДАКТИРОВАТЬ 2: Теперь я знаю, что здесь возникает та же проблема: Windows Forms: невозможно щелкнуть, чтобы сфокусировать MaskedTextBox в форме без верхнего уровня . Принятый ответ бесполезен для меня, а другие ответы кажутся непрактичными, так как мне пришлось бы добавлять обработчики событий в каждое текстовое поле ...

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

У меня была такая же проблема сегодня.Я попытался изменить TopLevel, как предлагали другие.Это не сработало.Где-то в моем поиске я увидел предложение создать событие щелчка для текстового поля и использовать его, чтобы заставить сосредоточиться на элементе управления.Это тоже не имело значения.Не было событий, которые должны были бы перехватывать и блокировать событие клика.Это был просто ребенок MDI с несколькими элементами управления, встроенными в панель на разделенном контейнере.Однако я не мог выделить текст в текстовых полях или элементах управления, полученных из текстовых полей.

Оказалось, что решением было переключить порядок childform.Show() и panel.Controls.Add(childform).Если вы добавляете дочернюю форму перед ее отображением, вы, очевидно, вызываете эту ошибку.

1 голос
/ 08 октября 2010

Я немного озадачен тем, что вы пытаетесь достичь. Я привык использовать пользовательский элемент управления, если я хочу встроить что-то в SplitPanel, и использовать форму MDI, если я хочу дочерние формы.

Работает ли какой-либо из этих подходов для вас, и если нет, то можете ли вы объяснить, почему нет / чего вы пытаетесь достичь?

Спасибо! Джеймс


* Редактировать *

Вы можете добавить панель (обычную панель, а не разделенную панель) в родительскую форму MDI и закрепить ее слева. Вместо этого добавьте все, что у вас есть в левой панели SplitContainer, на эту левую панель. Теперь вы можете создавать экземпляры форм, устанавливать их в качестве дочерних для основного родителя MDI и иметь все функции окна, которые вы ищете ... Вы можете максимизировать их, и они заполнят правую сторону родителя MDI; Вы можете выбрать каскад или плитку из меню окна и т. д.

Если вы хотите, чтобы пользователь динамически изменял размер левой панели, поместите разделительную панель в правую часть основного контейнера формы MDI; по умолчанию она будет прикреплена влево и будет отображаться в правой части панели. Теперь при запуске вы можете перетащить границу панели, чтобы изменить ее размер.

Помните, что MDI-форма похожа на любую другую форму ... вы можете добавить любой элемент управления, который вы хотите, на его поверхность, и .NET довольно умно использует встроенные дочерние окна.

Если вы все еще не уверены в том, что я пытаюсь описать, я постараюсь найти где-нибудь, где я могу отбросить пример проекта ... потому что все действительно сделано в конструкторе, на самом деле никакого кода я могу показать тебе. Вот код для создания формы в качестве дочернего элемента MDI (запущенного из родительского элемента MDI):

MyForm frm = new MyForm();
frm.MdiParent = this;
frm.Show();

Это все, что нужно.

НТН! Джеймс

...