Элемент управления фокусом внутри элемента управления DataGridView

У меня есть форма, содержащая элемент управления DataGridView с именем gridParameters. Я добавляю элемент управления поверх него на основе некоторых значений, чтобы добавить элементы управления, которые недоступны (например, DateTimePicker):

DateTimePicker dtp = new DateTimePicker();
gridParameters.Controls.Add(dtp);
dtp.Location = rowCellLocation;
dtp.Size = rowCellSize;
dtp.CustomFormat = "yyyy/MM/dd";
dtp.Format = DateTimePickerFormat.Custom;
dtp.Tag = rowId;
dtp.ValueChanged += dtp_SelectedValueChanged;
dtp.Visible = true;

Этот код находится внутри цикла, который перебирает строки сетки и находится в операторе If (я добавляю DateTimePicker для некоторых строк и NumericUpDown для других на основе значения ячейки строки). Переменные rowCellLocation, rowCellSize и rowId устанавливаются в цикле для каждой строки.

Мой режим выбора DataGridView — это полный выбор строки. Я хочу, чтобы добавленный элемент управления (DateTimePicker, NumericUpDown...) получал фокус, когда я переключаюсь на строку, например, когда я щелкаю строку мышью.

Для этого я пробовал следующее: в цикле, создающем элементы управления, я устанавливал элемент управления в соответствующее свойство Tag строки. В событии сетки Row_Enter (я также пробовал CurrentCellChanged) я добавил следующий код:

if (gridParameters.CurrentRow.Tag != null)
{
    ((Control)gridParameters.CurrentRow.Tag).Focus();
}

Я также пробовал использовать Select(), а также

this.ActiveControl = (Control)gridParameters.CurrentRow.Tag;

Ни одно из вышеперечисленных не устанавливает фокус на элемент управления.

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

ОБНОВЛЕНИЕ: установка фокуса на другой элемент управления за пределами DataGridView работает просто отлично (например, установка фокуса на кнопку «ОК» работает) .


person Ron Dadon    schedule 30.05.2015    source источник
comment
Попробуйте дважды щелкнуть по ячейке и посмотреть, сфокусируется ли элемент управления.   -  person Rahul    schedule 30.05.2015
comment
@Rahul Двойной щелчок не работает. Я не пытаюсь редактировать ячейку, я пытаюсь установить фокус на другой элемент управления, когда фокус получает конкретная строка.   -  person Ron Dadon    schedule 30.05.2015
comment
@EugenePodskal Спасибо, но, как я уже сказал в вопросе, я уже пробовал свойство ActiveControl (на самом деле понял идею из вопроса, который вы связали, который я искал в Google, прежде чем задавать свой собственный вопрос), который также не работает. Элемент управления сеткой удерживает фокус на выбранной строке.   -  person Ron Dadon    schedule 30.05.2015
comment
Хм, дочитал до неформатированного кода, решил отформатировать и забыл потом прочитать. Всякое бывает, извини. Но если этот подход не работает, почему бы вам не попробовать создать пользовательские столбцы ? Насколько я понимаю, это стандартный способ решения таких задач.   -  person Eugene Podskal    schedule 30.05.2015
comment
@EugenePodskal Все в порядке :) Я рассмотрел пользовательские столбцы, но в этом случае они не помогут, потому что мне нужны разные элементы управления для разных строк в одном столбце. Например, в левом столбце для строки 1 будет DateTimePicker, для строки 2 — NumericUpDown, для строки 3 — DateTimePicker только с форматом времени и т. д.   -  person Ron Dadon    schedule 30.05.2015
comment
Вы можете попытаться сделать ячейку (и столбец), которая отрисовывает себя по-другому в зависимости от его пользовательского свойства (например, enum {Date, Num}), затем просто установите для этого свойства необходимое значение для каждой ячейки. Ячейка будет рисовать себя каким-то изображением? это выглядит как требуемый контроль (может быть, есть более простой и лучший способ?). И при щелчке по ячейке вы добавите реальный контроль, как в c-sharpcorner.com/UploadFile/0f68f2/ в зависимости от значения.   -  person Eugene Podskal    schedule 30.05.2015
comment
Что ж, это плохая идея со многих точек зрения, но, наверное, она может сработать.   -  person Eugene Podskal    schedule 30.05.2015
comment
@EugenePodskal Спасибо за ваши усилия. В конце концов я сдался на данный момент, если кто-то не разберется с этим, не мог найти, как элементы управления в коллекции элементов управления DGV не фокусируются, и любой обход кажется не лучше, чем текущее состояние.   -  person Ron Dadon    schedule 01.06.2015
comment
Не нужно спасибо. Предложенное мной решение кажется хуже самой проблемы. Тем не менее удачи. И если вы не сможете решить эту проблему только в WinForms, вы можете рассмотреть возможность хостинга WPF dataGrid с селектором шаблонов. Этот может быть медленным, но по крайней мере должен работать .   -  person Eugene Podskal    schedule 01.06.2015
comment
Я не могу воспроизвести вашу проблему, так как она отлично работает для меня. Сколько строк у вас есть в вашем DataGridView? Разве вы не можете использовать TableLayoutPanel вместо DataGridView?   -  person Bioukh    schedule 01.06.2015