2016-05-21 2 views
0

Я делаю себя менеджером проекта, и мне нужно обновлять список проектов так часто. Когда я обновляю Менеджер проектов, я хочу выбрать элемент, который был ранее выбран. Но этот выбор заставляет мое текстовое поле отменить выбор, поэтому происходит то, что это текстовое поле отменяет выбор после ввода одного ключа.Выбранный TextBox отменяет выбор при изменении ListBox

Так обрисовать, что происходит:

  • Я пытаюсь изменить один текстовом поле
  • Издание вызывает обновление в проекте -> программа вызывает RefreshProjectList()
  • RefreshProjectList() на отмеченную позицию причин выбранных текстовое поле чтобы отменить
  • Результат: Вы должны выбрать текстовое поле после написания одного символа

Picture if useful

These selected text boxes are struggling to be edited

Код:

private void RefreshProjectList() { 
     if (BlockListReload) 
      return; 

     Project selected = (Project)ProjectList.SelectedItem; 
     ProjectList.Items.Clear(); 
     CurrentlyShown.Clear(); 

     foreach(Project p in Projects){ 
      if (p.state == State.Planned && ShowPlanned.Checked) { 
       CurrentlyShown.Add(p); 
       ProjectList.Items.Add(p); 
      } 
      if (p.state == State.Active && ShowActive.Checked) { 
       CurrentlyShown.Add(p); 
       ProjectList.Items.Add(p); 
      } 
      if (p.state == State.Finished && ShowFinished.Checked) { 
       CurrentlyShown.Add(p); 
       ProjectList.Items.Add(p); 
      } 
      if (p.state == State.Delayed && ShowDelayed.Checked) { 
       CurrentlyShown.Add(p); 
       ProjectList.Items.Add(p); 
      } 
     } 

     if (selected == null) 
      return; 

     if (ProjectList.Items.Contains(selected)) { 
      ProjectList.SelectedItem = selected; // IF I REMOVE THIS 
     } else { 
      if (ProjectList.Items.Count > 0) 
       ProjectList.SelectedIndex = 0; // OR THIS LINE, EVERYTHING WORKS 
     } 
    } 

Если вам нужно больше коды, я буду рад предоставить, но я не хочу, чтобы спам вас с нагрузками неудобного кода.

В: Почему изменение выбранного элемента в ListBox вызывает снятие выделения с TextBox и как его предотвратить?

+0

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

+0

@jdweng Я уверен, что проблема вызвана теми строками, отмеченными (// ЗДЕСЬ), потому что, если я прокомментирую эти строки, все будет хорошо. (За исключением того, что ListBox не сохраняет свой выбор, поэтому я это делаю) – Meowxiik

+0

Is HideSelection on? – TaW

ответ

0

Несколько элементов управления, которые могут выбирать текст или предметы, также поставляются с имуществом HideSelection.

Это включает в себя:

  • TextBox
  • RichTextBox
  • ListView

но не

  • ListBox
  • CheckedListBox
  • DataGridView

Как это или не она по умолчанию всегда true поэтому выбор скрыт, когда фокус находится вне контроля ..

Просто установите его false в конструкторе и вы можете видеть весь выбор независимо от того, где находится фокус ..

+0

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

+0

Ну, я не знаю, что вы подразумеваете под «написание чего-то более длинного» или «написания символа»; но пока функция HideSelection верна, вы не можете видеть выделение, пока не переместите фокус в текстовое поле; если вы это сделаете, щелкнув выбор курса, действительно исчез. Сначала установите HideSelection = false, а затем добавьте тестовую кнопку, которая сообщает SelectedText одного из полей. Если он действительно пуст, у вас действительно есть проблема __second__. Начните с фиксации __first__ одного, хотя ..! – TaW

+0

Плохо, я никогда не могу объяснить, надеюсь, теперь. Обычно вы можете писать в текстовом поле любое количество символов без проблем. Но в моем случае вы пишете персонажа в текстовом поле, и благодаря этим двум строкам, отмеченным как текстовое поле отменяет выбор, вы больше не можете писать в нем. Поэтому я заканчиваю ситуацию, когда мне нужно будет выбирать это текстовое поле каждый раз, когда я набираю символ. – Meowxiik

0

OMG. Я честно не знаю, почему я этого не видел.

ProjectList.SelectedItem = selected; 
//where ProjectList is ListBox<Project> and selected is Project 

Я выбираю элемент в списке проектов (ListBox). Я не понимал, что это вызвало событие ProjectList_SelectedIndexChanged(), которое это делало.

EDIT: решаемый путем добавления этого:

 if (focused != null) { 
      this.ActiveControl = focused; 
      focused.Select(focused.TextLength,0); 
     } 

где сосредоточен является TextBox, я установил, чтобы последние выбранный TextBox, и это форма.
Спасибо TaW.

+0

__If__ все решено, вы должны решить, есть ли у вас ответ, который полезен другим, или если проблема была только опечаткой и т. Д. В последнем случае она должна быть закрыта и в конечном итоге удалена из SO. Если ваши проблемы не все решены, это не ответ, и вы должны отредактировать вопрос. Во всяком случае: выбор элемента в ListBox не приведет к тому, что ничего не произойдет. Если у вас нет кода с этим эффектом, возможно, в выбранном событии или в событии selectedvaluechanged. – TaW

+0

@TaW Добавленное решение, я до сих пор не знаю, почему это происходит, но я вручную выбрал TextBox, который был ранее выбран. – Meowxiik

+0

Хорошо, если вы счастливы. Однако, пожалуйста, будьте осторожны, чтобы сделать различие между __Focus__ и __Selection__. TextBox потерял __focus__, когда вы нажали (или добавили вкладку) в другое место, но он не потерял свой __TextSelection__ (который только что был __hidden__) не сам «потерял выбор», потому что элемент управления в запущенной программе __can't__ будет __selected__ в любом случае, просто __focused__! – TaW

Смежные вопросы