Странный символ 'q' проблема с пользовательской ячейкой DataGridViewColumn DataGridView - PullRequest
2 голосов
/ 24 января 2011

Я создал настраиваемый столбец для представления данных, извлекая его из DataGridViewColumn, DataGridViewTextBoxCell и реализуя IDataGridViewEditingControl.

Я создал пользовательский элемент управления, который содержит простой 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 не связан ни с одним источником данных.

Может кто-нибудь указать мне на проблему в этом коде?

Ответы [ 2 ]

2 голосов
/ 24 января 2011

Сделайте следующее изменение и посмотрите, поможет ли это:

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 голосов
/ 24 января 2011

Попробуйте поставить этот код и посмотреть поведение. (см. мои комментарии ниже вашего вопроса)

Проблема, которую вы заявили. Я мог бы воспроизвести с помощью клавиш со стрелками -> навигация к ячейке Проблема в том, что он переходит в режим редактирования только после нажатия первой клавиши. Попробуйте поместить этот код в тип CustomTextCell и посмотрите поведение.

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