2011-02-07 32 views
3

我在表单上有一个datagridview。 并且网格中有4列 - 无,答案,键,结果。 不,键和结果列是只读的。这意味着我不打算向这些列输入一些数据。 但我将输入值到Answer列。 和值可以只 - A,B,C,D和E. 当我按例如X键我不想X显示在单元格中。 我可以用文本框的按键事件来做到这一点。只允许DataGridiView特定的字母单元格

现在你能告诉我,我如何使用Answer列单元格事件的按键事件来实现它。

回答

3

您可以使用DataGridViewEditingControlShowing事件来完成此操作。

在此事件的事件处理程序中,您可以访问在数据网格中输入数据时显示的Textbox
这意味着,在这一点上,您可以将事件处理程序附加到文本框的KeyPress事件显示:

 private bool _firstTime = true; 

     private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
     { 
      if(!_firstTime) 
      { 
       return; 
      } 

      _firstTime = false; 

      var t = e.Control as TextBox; 

      if(t != null) 
      { 
       t.KeyPress += OnKeyPress; 
      } 
     } 

     private void OnKeyPress(object sender, KeyPressEventArgs e) 
     { 
      if(e.KeyChar != 'A' && e.KeyChar != 'B' && e.KeyChar != 'C') 
      { 
       e.Handled = true; 
      } 
     } 

由于DataGridView的永远的“分享”文本框在网格中的每个单元控制使用文本框,你应该检查它是否是第一次引发事件。
如果DataGridView中的其他列不是只读的,并且您希望用户输入数据的位置也不受限制,那么这种方法就不适合。 (除非您在OnKeyPress事件处理程序中检查当前单元格属于哪个列)。

(注意,你必须考虑小写字母a,b,c。