我想在datagrid中当鼠标在单元格中按下时便选中单元格所在的行,然后再点击此行的任一个单元格时都不产生对所点击单元格的任何操作(不要产生默认情况下在单元格中按下鼠标时的那种现象),
public int view()
{
if(dataGrid1.IsSelected(dataGrid1.CurrentRowIndex))
return -1;
dataGrid1.Select(dataGrid1.CurrentRowIndex);
return 0;
}
private void dataGrid1_Click(object sender, System.EventArgs e)
{
   view();
}
但以上代码的问题是:
1、当在一个未被选中的行中的单元格中按下鼠标时,只选中了当前单元格,松开鼠标时,选中整行(整行都为蓝色);
2、当再次在这个单元格中按下鼠标时,看上去好象取消选择了(整行都变回原来的颜色),松开时又恢复选中整行了;
3、如果不进行第2步,而是点击被选中的行的其它单元格或其他行的单元格时时现象同第1步。
我不知道该怎么处理,要不各位老大试一下代码,看看有什么问题。
帮忙想想解决的办法,谢谢。

解决方案 »

  1.   

    private void dataGrid1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    _Hti = dataGrid1.HitTest(e.X, e.Y);
    if (e.Button==MouseButtons.Left)
               ToggleCheckState(_Hti.Row, _Hti.Column, false);
    }private void ToggleCheckState(int piRow, int piColumn, bool plFirstColumn)
    {
    string lcMappingName="";
    if (piColumn>=0 && piColumn<this.dataGrid1.TableStyles[0].GridColumnStyles.Count)
    {
    string lcString=this.dataGrid1.TableStyles[0].GridColumnStyles[piColumn].MappingName;
    if (this._ColumnStyles.Contains(lcString))
    lcMappingName=lcString;
    }
    if (plFirstColumn && lcMappingName=="" && this._ColumnStyles.Count>0)
    lcMappingName=this._ColumnStyles[0].Id; if (this.npDataSource!=null && this.npDataSource.IsOpened && this.npDataSource.Columns.Contains(lcMappingName))
    {
    bool llToFireRecMoved=this.npDataSource.IsToFireRecordMovedEvent;
    this.npDataSource.IsToFireRecordMovedEvent=false;
    this.npDataSource.Go(piRow); bool llChecked=!ReportLib.StrToBool(this.npDataSource.GetString(lcMappingName));
    string lcValue=(llChecked?"Y":"");
    this.npDataSource.SetField(lcMappingName, lcValue); this.npDataSource.IsToFireRecordMovedEvent=llToFireRecMoved;
    }
    }
      

  2.   

    要保证对 DataGrid 进行鼠标操作, 只选择一行, 或者 解除上次选择, 
    我重载了 3 个方法分别是 DataGrid 的 MouseDown, MouseUp , 和 Scroll
    用鼠标和 ctrl shift 键, 都能保证最后选中一行..纯粹键盘事件, 还未能对应.
      

  3.   

    _bSelectFlag 记录这个dg是否真的被Click过..
    你把dg的名字换掉, 还有这个 _bSelectFlag 声明一下
    就可以完全用在你自己的代码里了private void dg_Scroll(object sender, System.EventArgs e)
    {
    this.dg.Select(this.dg.CurrentRowIndex); if (!_bSelectFlag)
    {
    this.dg.UnSelect(this.dg.CurrentRowIndex);
    }
    }
    private void dg_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    if (this.dg.CurrentRowIndex == -1)
    {
    return;
    } int i;
    for (i = 0; i < this._dtTable.Rows.Count; ++i)
    {
    this.dg.UnSelect(i);
    } if (_bSelectFlag)
    {
    this.dg.Select(this.dg.CurrentRowIndex);
    } return;
    }
    private void dg_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    if (e.Y > dg.PreferredRowHeight)
    {
    _bSelectFlag = true;
    }
    else
    {
    _bSelectFlag = false;
    } return;
    }
      

  4.   

    我也没有看明白,判断是左键的down事件,然后选定不就可以了么,楼主又不是没有实现选定。
      

  5.   

    只重载 MouseDown , 那么我用鼠标在 DataGrid 里拖动,或者是 当数据行数超出能显示的
    范围后, 自动添加垂直滚动条. 那么 当我滚动 滚动条的时候
    都会发现 DataGrid 出现不正常选定的 现象. 所以, 重载 MouseUp和 Scroll, 保证 单行选定
      

  6.   

    简单的办法就能处理,不需要重载,利用datagrid中已经被选中的单元格再次点击不产生动作这一特性即可解决:
    private void bxGrid_DEP_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    if (e.Button == MouseButtons.Left)
    {
    System.Windows.Forms.DataGrid.HitTestInfo hti;
    BX.BXGrid bxGrid = bxGrid_DEP;
    hti = bxGrid.HitTest(e.X,e.Y);
    if ((hti.Type == System.Windows.Forms.DataGrid.HitTestType.Cell)||(hti.Type == System.Windows.Forms.DataGrid.HitTestType.RowHeader)) 
    {
    for(int i=0;i<bxGrid.Row_num;i++)
    {
    if((Boolean)bxGrid[i,bxGrid.getIndex("check_option")] == true)
    {
    bxGrid[i,bxGrid.getIndex("check_option")] = false;
    break;
    }
    }
    bxGrid[hti.Row,bxGrid.getIndex("check_option")] = true;
    bxGrid.CurrentCell = new DataGridCell(hti.Row, hti.Column);    //实现此功能的关键
    bxGrid.Select(hti.Row); //实现此功能的关键
    Query1();
    }
    }
    }