Hi,
I have a custom cell editor that contains a TextBox and a Button. The user can edit the text directly or press the button to display a dialog. Using the examples I found I could implement nearly everthing but one thing is missing:
When editing starts I would like to set the focus to the TextBox in theeditor and select the contained text, so that the user can start typing immediately. Just the behaviour of the normal GridViewTextBoxColumn. In my editor an extra click is required to start typing. The call to Focus() seems to have no effect.
Thanks in advance
Christoph
(Using Q2 2011 on .NET 3.5)
This is what I did:
My custom GridViewDataColumn:
My custom EditorElement:
My custom GridEditor:
I try to set the focus in BeginEdit() but this has no effect.
My custom GridDataCellElement:
(The puspose of this cell-element is to start editing as soon as cell becomes current. I did not manage to get this behaviour by setting BeginEditMode)
I have a custom cell editor that contains a TextBox and a Button. The user can edit the text directly or press the button to display a dialog. Using the examples I found I could implement nearly everthing but one thing is missing:
When editing starts I would like to set the focus to the TextBox in theeditor and select the contained text, so that the user can start typing immediately. Just the behaviour of the normal GridViewTextBoxColumn. In my editor an extra click is required to start typing. The call to Focus() seems to have no effect.
Thanks in advance
Christoph
(Using Q2 2011 on .NET 3.5)
This is what I did:
My custom GridViewDataColumn:
public
class
IntelliBoxColumn : GridViewDataColumn
{
public
IntelliBoxColumn(
string
columnName) :
base
(columnName) { }
public
override
Type GetDefaultEditorType()
{
return
typeof
(IntelliBoxGridEditor);
}
public
override
Type GetCellType(GridViewRowInfo row)
{
if
(row
is
GridViewDataRowInfo)
{
return
typeof
(IntelliBoxCellElement);
}
return
base
.GetCellType(row);
}
}
My custom EditorElement:
public
partial
class
IntelliBoxEditorElement : LightVisualElement
{
RadTextBoxItem textBox;
RadButtonElement button;
public
RadTextBoxItem TextBox {
get
{
return
this
.textBox;}}
public
RadButtonElement Button {
get
{
return
this
.button; } }
protected
override
void
CreateChildElements()
{
textBox =
new
RadTextBoxItem();
textBox.RouteMessages =
true
;
button =
new
RadButtonElement(
"..."
);
button.Padding =
new
Padding(2, 0, 2, 0);
this
.Children.Add(textBox);
this
.Children.Add(button);
}
protected
override
SizeF ArrangeOverride(SizeF finalSize)
{
RectangleF clientRect = GetClientRectangle(finalSize);
RectangleF buttonRect =
new
RectangleF(clientRect.Right - button.DesiredSize.Width, clientRect.Top,
button.DesiredSize.Width, clientRect.Height);
RectangleF textRect =
new
RectangleF(clientRect.Left, clientRect.Top + (clientRect.Height - textBox.DesiredSize.Height) / 2,
buttonRect.Left - clientRect.Left - 2, textBox.DesiredSize.Height);
foreach
(RadElement element
in
this
.Children)
{
if
(element ==
this
.textBox)
{
element.Arrange(textRect);
}
else
if
(element ==
this
.button)
{
element.Arrange(buttonRect);
}
else
{
ArrangeElement(element, finalSize);
}
}
return
finalSize;
}
}
My custom GridEditor:
I try to set the focus in BeginEdit() but this has no effect.
public
class
IntelliBoxGridEditor : BaseGridEditor
{
private
bool
endEditOnLostFocus =
false
;
protected
override
Telerik.WinControls.RadElement CreateEditorElement()
{
return
new
IntelliBoxEditorElement();
}
private
IntelliBoxEditorElement IntelliBox
{
get
{
return
(IntelliBoxEditorElement)EditorElement; }
}
public
override
bool
EndEditOnLostFocus
{
get
{
return
endEditOnLostFocus; }
}
public
override
object
Value
{
get
{
return
IntelliBox.Text;}
set
{
string
strValue =
string
.Empty;
if
(value !=
null
&& value != DBNull.Value) strValue = value.ToString();
IntelliBox.TextBox.Text = strValue;
}
}
public
override
Type DataType
{
get
{
return
typeof
(
string
);}
}
public
override
void
BeginEdit()
{
base
.BeginEdit();
IntelliBox.TextBox.TextChanging +=
new
TextChangingEventHandler(TextBox_TextChanging);
IntelliBox.TextBox.TextChanged +=
new
EventHandler(TextBox_TextChanged);
IntelliBox.TextBox.KeyDown +=
new
KeyEventHandler(TextBox_KeyDown);
IntelliBox.Button.Click +=
new
EventHandler(Button_Click);
IntelliBox.TextBox.SelectAll();
IntelliBox.TextBox.Focus();
}
public
override
bool
EndEdit()
{
IntelliBox.TextBox.TextChanging -=
new
TextChangingEventHandler(TextBox_TextChanging);
IntelliBox.TextBox.TextChanged -=
new
EventHandler(TextBox_TextChanged);
IntelliBox.TextBox.KeyDown -=
new
KeyEventHandler(TextBox_KeyDown);
IntelliBox.Button.Click -=
new
EventHandler(Button_Click);
return
base
.EndEdit();
}
void
TextBox_TextChanging(
object
sender, TextChangingEventArgs e)
{
ValueChangingEventArgs args =
new
ValueChangingEventArgs(e.NewValue);
args.OldValue = e.OldValue;
OnValueChanging(args);
e.Cancel = args.Cancel;
}
void
TextBox_TextChanged(
object
sender, EventArgs e)
{
OnValueChanged();
}
void
TextBox_KeyDown(
object
sender, KeyEventArgs e)
{
RadGridView grid = ((RadElement)sender).ElementTree.Control
as
RadGridView;
if
(grid !=
null
)
{
switch
(e.KeyCode)
{
case
Keys.Escape:
case
Keys.Enter:
case
Keys.Up:
case
Keys.Down:
grid.GridBehavior.ProcessKeyDown(e);
break
;
}
}
}
void
Button_Click(
object
sender, EventArgs e)
{
endEditOnLostFocus =
false
;
var gridView = (WPDataGrid)IntelliBox.ElementTree.Control;
gridView.RaiseButtonClicked(
this
);
endEditOnLostFocus =
true
;
gridView.EndEdit();
}
}
My custom GridDataCellElement:
(The puspose of this cell-element is to start editing as soon as cell becomes current. I did not manage to get this behaviour by setting BeginEditMode)
public
class
IntelliBoxCellElement : GridDataCellElement
{
private
RadLabelElement _label;
private
IntelliBoxColumn _column;
private
GridRowElement _row;
public
IntelliBoxCellElement(GridViewColumn column, GridRowElement row)
:
base
(column, row)
{
this
.BackColor = Color.White;
}
private
bool
_wasCurrent;
public
override
bool
IsCurrent
{
get
{
return
base
.IsCurrent; }
set
{
base
.IsCurrent = value;
if
(value && value != _wasCurrent)
_row.RowInfo.Cells[_column.Name].BeginEdit();
_wasCurrent = value;
}
}
protected
override
Type ThemeEffectiveType {
get
{
return
typeof
(GridDataCellElement); } }
public
override
void
Initialize(GridViewColumn column, GridRowElement row)
{
_column = (IntelliBoxColumn)column;
_row = row;
base
.Initialize(column, row);
}
protected
override
void
CreateChildElements()
{
_label =
new
RadLabelElement();
_label.Margin =
new
Padding(2, 2, 2, 2);
_label.LabelText.AutoEllipsis =
true
;
_label.LabelText.AutoSize =
true
;
_label.LabelText.AutoSizeMode = RadAutoSizeMode.Auto;
_label.LabelText.TextWrap =
false
;
this
.Children.Add(_label);
}
protected
override
void
DisposeManagedResources()
{
base
.DisposeManagedResources();
}
protected
override
void
SetContentCore(
object
value)
{
if
(value !=
null
)
{
_label.Text = value.ToString();
}
}
public
override
bool
IsCompatible(GridViewColumn data,
object
context)
{
return
data
is
IntelliBoxColumn && context
is
GridDataRowElement;
}
}