我已經爲datagridview從DataGridViewColumn,DataGridViewTextBoxCell派生併爲其實現IDataGridViewEditingControl創建了一個自定義列。DataGridView怪異字符'q'問題自定義DataGridViewColumn單元格
我創建了一個用戶控件,它包含一個簡單的TextBox,並使用該控件作爲該列的編輯控件。
現在我遇到了一個奇怪的問題,這種情況。當我按下字符'q'時,DataGridView的自定義列中的單元格不顯示它,並且什麼也沒有發生,但是當我按任何其他鍵時,它正確顯示在單元格中。
這裏有什麼問題?我嘗試了各種方式,爲每個事件調試它,但徒勞無功,我還沒有找到任何東西。
我給出了我創建的自定義列的代碼。
public class CustomControlColumn : DataGridViewColumn
{
public CustomControlColumn() : base(new CustomTextCell()) { }
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
// Ensure that the cell used for the template is a CustomComboCell.
if (value != null && !value.GetType().IsAssignableFrom(typeof(CustomTextCell)))
{
throw new InvalidCastException("Must be a CustomTextCell");
}
base.CellTemplate = value;
}
}
}
public class CustomTextCell : DataGridViewTextBoxCell
{
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
// Set the value of the editing control to the current cell value.
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
var control = DataGridView.EditingControl as CustomTextBoxControl;
if (OwningColumn == null)
return;
// Use the default row value when Value property is null.
if (Value == null)
{
control.Text = string.Empty;
}
else
{
control.Text = Value.ToString();
}
}
public override Type EditType
{
get
{
// Return the type of the editing contol that CustomComboCell uses.
return typeof(CustomControlEditingControl);
}
}
public override Type ValueType
{
get
{
// Return the type of the value that CustomTextCell contains.
return typeof(String);
}
}
public override object DefaultNewRowValue
{
get
{
// Use the empty string as the default value.
return string.Empty;
}
}
}
class CustomControlEditingControl : CustomTextBoxControl, IDataGridViewEditingControl
{
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
// Nothing to do
}
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
// Let the control handle the keys listed.
switch (keyData & Keys.KeyCode)
{
case Keys.Left:
case Keys.Up:
case Keys.Down:
case Keys.Right:
case Keys.Home:
case Keys.End:
case Keys.PageDown:
case Keys.PageUp:
return true;
default:
return false;
}
}
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return EditingControlFormattedValue;
}
public DataGridView EditingControlDataGridView { get; set; }
public object EditingControlFormattedValue
{
get { return Text; }
set { Text = value.ToString(); }
}
public int EditingControlRowIndex { get; set;}
public bool EditingControlValueChanged { get; set; }
public Cursor EditingPanelCursor
{
get { return base.Cursor; }
}
public bool RepositionEditingControlOnValueChange
{
get { return false; }
}
}
我已經通過設計器在DataGridView中添加了這個列,DataGridView與任何DataSource都沒有關聯。
任何人都可以指出我在這個代碼中的問題?
,那麼「Q」曾經出現在中...或者只有當你按下它第一次? – curtisk 2011-01-24 15:43:26
@ curtisk:它從來沒有出現,當我從某處複製它並粘貼它顯示。另外,如果我按下Shift + q,它將顯示爲大寫'Q'。我對這種行爲感到非常驚訝。 – JPReddy 2011-01-24 15:48:40
它不只是'q'鍵。如果我使用箭頭鍵導航到單元格並按下某個鍵,則該鍵輸入將被忽略。否則它工作正常..需要'q'和其他鍵輸入。 – 2011-01-24 15:50:16