我想在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步。
我不知道该怎么处理,要不各位老大试一下代码,看看有什么问题。
帮忙想想解决的办法,谢谢。
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步。
我不知道该怎么处理,要不各位老大试一下代码,看看有什么问题。
帮忙想想解决的办法,谢谢。
{
_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;
}
}
我重载了 3 个方法分别是 DataGrid 的 MouseDown, MouseUp , 和 Scroll
用鼠标和 ctrl shift 键, 都能保证最后选中一行..纯粹键盘事件, 还未能对应.
你把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;
}
范围后, 自动添加垂直滚动条. 那么 当我滚动 滚动条的时候
都会发现 DataGrid 出现不正常选定的 现象. 所以, 重载 MouseUp和 Scroll, 保证 单行选定
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();
}
}
}