Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 怪异的性格';q';DataGridView自定义DataGridViewColumn单元格有问题_C#_Winforms_Datagridview_Datagridviewcolumn - Fatal编程技术网

C# 怪异的性格';q';DataGridView自定义DataGridViewColumn单元格有问题

C# 怪异的性格';q';DataGridView自定义DataGridViewColumn单元格有问题,c#,winforms,datagridview,datagridviewcolumn,C#,Winforms,Datagridview,Datagridviewcolumn,我已经为datagridview创建了一个自定义列,它从DataGridViewColumn、DataGridViewTextBoxCell派生并实现IDataGridViewEditingControl 我创建了一个用户控件,其中包含一个简单的文本框,并将此控件用作该列的编辑控件 现在我在这个场景中遇到了一个奇怪的问题。当我按下字符“q”时,DataGridView的自定义列中的单元格不会显示它,也不会发生任何事情,但当我按下任何其他键时,它会正确地显示在单元格中 这里可能有什么问题?我尝试了

我已经为datagridview创建了一个自定义列,它从DataGridViewColumn、DataGridViewTextBoxCell派生并实现IDataGridViewEditingControl

我创建了一个用户控件,其中包含一个简单的文本框,并将此控件用作该列的编辑控件

现在我在这个场景中遇到了一个奇怪的问题。当我按下字符“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与任何数据源都没有关联


有人能告诉我这段代码中的问题吗?

试着写下这段代码,看看它的行为。(见我在你问题下方的评论)

你所说的问题。。我可以通过使用箭头键->导航到单元格来重新编程。 问题是,它只有在按下第一个键后才会进入编辑模式。 尝试将此代码放入CustomTextCell类型,并查看其行为

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

进行以下更改,看看是否有帮助:

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!
      }
    }
public bool editingcontrolwantsputkey(Keys-keyData,bool-datagridview-wantsputkey)
{
//让控件处理列出的键。
开关(钥匙数据和钥匙.钥匙代码)
{
箱子钥匙。左:
案例密钥。向上:
案例键。向下:
箱子钥匙。右:
案例密钥。主页:
案例关键。结束:
case Keys.PageDown:
case Keys.PageUp:
返回true;
违约:

//返回false;“q”是否有没有出现在框中……或者只有你先按它?@Curtik:当我从某处复制并粘贴它时,它永远不会出现。而且如果我按Shift+q,它会显示为大写字母“q”。我对这种行为感到非常惊讶。这不仅仅是“q”键。如果我使用箭头键导航到单元格并按一个键,该键就会输入被忽略。否则它工作正常。。接受“q”和其他键输入。@Vijay:q键对你有用吗?奇怪的是,我用两个winforms示例应用程序尝试了它,但这个键一直不起作用。只有Capital q起作用。需要筛选的代码太多了。你能帮我们缩小范围吗?谢谢你的帖子。在我的应用程序中,DGV已经有了EditO输入属性为true。因此,当我单击该单元格时,它进入编辑模式,如果我按下任何其他键,它会显示,但无论是我按下的第一个键还是在某些键之后,q都不会显示。对此行为完全感到困惑。即使在输入其他字符后,你也能显示q键吗?是的。但正如我提到的,它发生了我将尝试设置属性,看看会发生什么。但在添加我发布的代码后,它工作正常。“q”字符从未出现在我的示例应用程序中。但如果我使用shift+q,则即使在第一次按键时,它也会出现(-阅读解释…在EditingControlWantInputKey方法-return!DataGridViewWantInputKey中默认情况下的解释。感谢Vijay帮助我。我阅读了解释。Curtik的答案对我有效,然后我阅读了此链接。这是完美的Curtik。这是众目睽睽。我也阅读了Vijay Sirigiri给出的解释。非常感谢。非常感谢ird和不一致,即使你看MSDN的代码样本从2.0->4.0不等,很高兴我(我们)能够找到这个奇怪的答案。非常奇怪,我从过去4个小时就开始试图找到它背后的原因。