2011-01-24 103 views
2

我已經爲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都沒有關聯。

任何人都可以指出我在這個代碼中的問題?

+0

,那麼「Q」曾經出現在中...或者只有當你按下它第一次? – curtisk 2011-01-24 15:43:26

+0

@ curtisk:它從來沒有出現,當我從某處複製它並粘貼它顯示。另外,如果我按下Shift + q,它將顯示爲大寫'Q'。我對這種行爲感到非常驚訝。 – JPReddy 2011-01-24 15:48:40

+0

它不只是'q'鍵。如果我使用箭頭鍵導航到單元格並按下某個鍵,則該鍵輸入將被忽略。否則它工作正常..需要'q'和其他鍵輸入。 – 2011-01-24 15:50:16

回答

2

讓下面的變化,看看是否有幫助:

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; <--not this 
     return !dataGridViewWantsInputKey; //try this! 
     } 
    } 
2

嘗試將此代碼並看到行爲。 (請參閱我的意見下面你的問題)

你說的問題..我可以通過使用箭頭鍵repro - >導航到單元格。 問題是隻有在按下第一個鍵後纔會進入編輯模式。 嘗試將此代碼置於CustomTextCell類型中並查看行爲。

public override bool KeyEntersEditMode(KeyEventArgs e) 
{ 
    // for testing..  
    return true; 
}