GDBG, SelectionChanging and Arrow Keys
Clay,
I''m not able to get the correct row index in GDBG when changing the current row with the arrow keys up/down.
I''m setting up the ListBoxSelectionMode to One and adding these event handler to the form. I''m modifying the DataBoundSortByDisplayMember to reproduce the behaviour:
private void gridDataBoundGrid1_CurrentCellActivating(object sender, Syncfusion.Windows.Forms.Grid.GridCurrentCellActivatingEventArgs e)
{
if( e.RowIndex > 0 && e.ColIndex > 0 )
{
e.ColIndex = 0;
}
}
private void Model_SelectionChanging(object sender, GridSelectionChangingEventArgs e)
{
if( e.Range.IsRows )
{
MessageBox.Show( e.Range.Top.ToString() );
}
}
When you use the mouse to change the position, the correct index will be in the e.Range. If you use the arrow key up/down, the e.Range.Top still contains the index of the last position.
I''m using 2.0.5.1.
Regards,
Thomas
SIGN IN To post a reply.
7 Replies
AD
Administrator
Syncfusion Team
June 17, 2004 11:16 AM UTC
This is likely a bug, but I am not sure whether I am overlooking something that forces things to behave this way in ListBoxSelectionMode.
As a work around, I thnk you can handle the grid.KeyDone event (or override OnKeyDown), and raise the event yourself making sure you pass the proper row range. Here is some code that worked for me in a little sample.
private void gridDataBoundGrid1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
GridCurrentCell cc = this.gridDataBoundGrid1.CurrentCell;
if(e.KeyCode == Keys.Up && cc.RowIndex > this.gridDataBoundGrid1.Model.Rows.HeaderCount + 1)
{
GridRangeInfo currentRange = GridRangeInfo.Row(cc.RowIndex);
GridRangeInfo newRange = GridRangeInfo.Row(cc.RowIndex - 1);
GridSelectionChangingEventArgs se = new GridSelectionChangingEventArgs(newRange, GridSelectionReason.ArrowKey, GridRangeInfo.Empty);
this.gridDataBoundGrid1.Model.RaiseSelectionChanging(se);
if(!se.Cancel)
{
this.gridDataBoundGrid1.Selections.ChangeSelection(currentRange, newRange, false);
this.gridDataBoundGrid1.CurrentCell.InternalMove(GridDirectionType.Up, 1, GridSetCurrentCellOptions.None);
}
e.Handled = true;
}
else if(e.KeyCode == Keys.Down && cc.RowIndex < this.gridDataBoundGrid1.Model.RowCount)
{
GridRangeInfo currentRange = GridRangeInfo.Row(cc.RowIndex);
GridRangeInfo newRange = GridRangeInfo.Row(cc.RowIndex + 1);
GridSelectionChangingEventArgs se = new GridSelectionChangingEventArgs(newRange, GridSelectionReason.ArrowKey, GridRangeInfo.Empty);
this.gridDataBoundGrid1.Model.RaiseSelectionChanging(se);
if(!se.Cancel)
{
this.gridDataBoundGrid1.Selections.ChangeSelection(currentRange, newRange, false);
this.gridDataBoundGrid1.CurrentCell.InternalMove(GridDirectionType.Down, 1, GridSetCurrentCellOptions.None);
}
e.Handled = true;
}
}
AD
Administrator
Syncfusion Team
June 17, 2004 02:27 PM UTC
Hi Clay
Thanks for the code.
I''m using the follwing code in SelectionChanging:
http://www.syncfusion.com/Support/Forums/message.aspx?MessageID=14870
The row is not going to be current, because of the cancel in SelectionChanging. The move will not be made because se.Cancel is true:
this.Model.RaiseSelectionChanging(se);
if(!se.Cancel)
{
this.Selections.ChangeSelection(currentRange, newRange, false);
this.CurrentCell.InternalMove(GridDirectionType.Up, 1, GridSetCurrentCellOptions.None);
}
What I have to change in the code to get it running?
Regards,
Thomas
AD
Administrator
Syncfusion Team
June 17, 2004 02:40 PM UTC
f.y.i
I''m overriding the OnKeyDown method.
Regards,
Thomas
AD
Administrator
Syncfusion Team
June 17, 2004 07:59 PM UTC
If I understand you properly, you want to not display the current row colored as selected using ListBoxSelectionMode = one. Is this correct?
If so, I think you will have to do away with the ListBoxSelectionsMode = one setting. The reason is that with this setting, the current row will always be forced to be selected (Not withstanding anything you do in SelectionsChanging).
It would be straight-forward to have a SelectedRow property that was differert than the CurrentCell.RowIndex, and not use ListBoxSelectionMode. In PrepareViewStyleInfo, you could color SelectedRow if it were valid (say > -1). Then you can use CurrentCellMoving to test whether you want to change SelectedRow or not.
If I misunderstood what you need, please let me know.
AD
Administrator
Syncfusion Team
June 18, 2004 02:51 AM UTC
Clay,
I''ll prepare a sample that exactly shows what I need.
Thanks,
Thomas
AD
Administrator
Syncfusion Team
June 22, 2004 09:22 AM UTC
Hi Clay,
I''m updating the incident 11867 and attaching the sample.
Regards
Thomas
AD
Administrator
Syncfusion Team
June 22, 2004 11:52 AM UTC
The incident has been updated.
SIGN IN To post a reply.
- 7 Replies
- 1 Participant
-
AD Administrator
- Jun 17, 2004 10:23 AM UTC
- Jun 22, 2004 11:52 AM UTC