ce 中DataGrid的编辑有点问题

roczhan   2009-6-4 09:41 楼主
一个项目中要实现DataGrid的编辑功能我的代码如下:

  1. #region DataGrid编辑
  2.         private DataGridCell editCell;
  3.         private bool inEditMode = false;
  4.         private bool inUpdateMode = false;
  5.         private void dataGrid1_CurrentCellChanged(object sender, EventArgs e)
  6.         {
  7.             if (!inUpdateMode)
  8.             {
  9.                 if (inEditMode && !dataGrid1.CurrentCell.Equals(editCell))
  10.                 {
  11.                     ExitEditedMode(true);
  12.                 }

  13.                 // Enter edit mode
  14.                 editCell = dataGrid1.CurrentCell;
  15.                 if (dataGrid1.CurrentCell.ColumnNumber != 2 && dataGrid1.CurrentCell.ColumnNumber!=3)
  16.                     return;
  17.                 txtEdit.Text = ((double)dataGrid1[editCell.RowNumber, editCell.ColumnNumber]).ToString();
  18.                 Rectangle cellPos = dataGrid1.GetCellBounds(editCell.RowNumber,
  19.                 editCell.ColumnNumber);
  20.                 txtEdit.Left = cellPos.Left + 8;
  21.                 txtEdit.Top = cellPos.Top + dataGrid1.Top - 1;
  22.                 txtEdit.Width = cellPos.Width + 2;
  23.                 txtEdit.Height = cellPos.Height;
  24.                 txtEdit.Visible = true;
  25.                 inEditMode = true;
  26.                 txtEdit.Focus();
  27.                 txtEdit.SelectionStart = txtEdit.Text.Length;
  28.             }

  29.         }
  30.         // Update or Cancel edited cell
  31.         private void ExitEditedMode(bool isUpdate)
  32.         {

  33.             inUpdateMode = true;
  34.             //dataGrid1.Visible = false;
  35.             DataGridCell currentCell = dataGrid1.CurrentCell;
  36.             if (isUpdate)
  37.                 dataGrid1[editCell.RowNumber, editCell.ColumnNumber] = txtEdit.Text;
  38.             dataGrid1.CurrentCell = currentCell;
  39.             //dataGrid1.Visible = true;
  40.             inUpdateMode = false;
  41.             txtEdit.Visible = false;
  42.             inEditMode = false;
  43.         }

  44.         private void dataGrid1_MouseUp(object sender, MouseEventArgs e)
  45.         {
  46.             DataGrid.HitTestInfo hitTest = dataGrid1.HitTest(e.X, e.Y);
  47.             if (hitTest.Type == DataGrid.HitTestType.ColumnHeader)
  48.             {
  49.                 // Exit edit mode
  50.                 txtEdit.Visible = false;
  51.                 inEditMode = false;

  52.                 // Sort tapped column
  53.                 DataTable dataTable = (DataTable)dataGrid1.DataSource;
  54.                 DataView dataView = dataTable.DefaultView;
  55.                 string columnName = dataTable.Columns[hitTest.Column].ColumnName;
  56.                 if (dataView.Sort == columnName)
  57.                     dataView.Sort = columnName + " DESC";
  58.                 else
  59.                     dataView.Sort = columnName;
  60.             }

  61.         }

  62.         private void txtEdit_KeyDown(object sender, KeyEventArgs e)
  63.         {
  64.             if (e.KeyCode == Keys.Escape)
  65.             {
  66.                 ExitEditedMode(false);
  67.             }
  68.             else if (e.KeyCode == Keys.Enter)
  69.             {
  70.                 ExitEditedMode(true);
  71.             }
  72.         }
  73.         #endregion

  74.         private void txtEdit_LostFocus(object sender, EventArgs e)
  75.         {
  76.             ExitEditedMode(true);
  77.         }

原文地址是:[url=http://www.cnblogs.com/dagon007/archive/2005/05/24/161202.html][/url]

这个可以实现此功能,但是当移动滚动条时文本框不会消失,这样,会跟着滚动条跑,
我开始以为可以在文本框的焦点丢失事件中处理,可是移动滚动条时根本不会触发焦点丢失事件,
我现在有一个想法就是通过DataGrid的鼠标事件来判断 是否是在拖动滚动条,但是不知道要怎么写?
求Ce版的高手帮忙看看,
或者有别的思路说说也行

回复评论 (5)

不会C#,帮顶吧。。。。。
点赞  2009-6-4 09:55
DataGrid没有关于Scroll Bar的事件吧?
就算有,Scroll Bar拉下来后,CurrentCell还在上面第一行,你还是没办法获得新位置,很难办哦~!
点赞  2009-6-4 11:25
有事件就不用这么麻烦了,我只想移动滚动条时隐藏就可以了,
点赞  2009-6-4 19:48
将焦点获取到最后的位置

int  ttotal=dataGrid1.CurrentCell.RowNumber;
dataGrid1.CurrentCell = new DataGridCell(ttotal, 1);

感谢耶稣,希望能帮到你。
点赞  2012-9-6 23:27
用datagrid的click事件也可以吧?
点赞  2012-9-6 23:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复