Спасибо всем, кто внес свой вклад.Я думал, что у digEmAll, в частности, был лучший ответ.Тем не менее, я публикую свою полную реализацию в качестве ответа, чтобы помочь другим, кто находит эти вопросы.
Реализация UpperCaseTextBox:
public class UpperCaseTextBox : TextBox
{
public UpperCaseTextBox()
: base()
{
base.CharacterCasing = this.CharacterCasing;
}
private CharacterCasing _characterCasing = CharacterCasing.Upper;
[DefaultValue(CharacterCasing.Upper)]
public new CharacterCasing CharacterCasing
{
get
{
return _characterCasing;
}
set
{
base.CharacterCasing = value;
_characterCasing = value;
}
}
}
Реализация UpperCaseDataGridView:
public class UpperCaseDataGridView : DataGridView
{
private CharacterCasing _textBoxCharacterCasing = CharacterCasing.Upper;
[CategoryAttribute("Behavior")]
[DescriptionAttribute("Sets CharacterCasing of all contained TextBox controls.")]
[DefaultValue(CharacterCasing.Upper)]
public CharacterCasing TextBoxCharacterCasing
{
get
{
return _textBoxCharacterCasing;
}
set
{
_textBoxCharacterCasing = value;
}
}
protected override void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e)
{
var txtBox = EditingControl as TextBox;
if (txtBox != null)
txtBox.CharacterCasing = this.TextBoxCharacterCasing;
base.OnEditingControlShowing(e);
}
}
Можно реализовать эту функциональность с использованием меньшего количества кода, чем указано выше, однако я намеренно стремился к гибкой, надежной реализации, которая хорошо сочетается с окном «Свойства», и позволяет мне переопределять верхний регистр в тех случаях, когда это необходимо, без необходимости отрывать элемент управления.и заменить на ванильный контроль и т. д.
Еще раз спасибо всем, кто внес свой вклад.