It is often required in the application/control to detect Start and End of Scroll to get a certain behaviour with respect to scrolling. This blog explains how to implement the following in C1TrueDbGrid:
C1TrueDBGrid does not have a direct way of detecting EndScroll/AfterScroll. There is one Scroll event that actually occurs before C1TrueDBgrid gets a new Scroll value, so how could one go about detecting EndScroll/AfterScroll? Here is the way:
The custom class now looks like this:
class MyTDBG : C1.Win .C1TrueDBGrid .C1TrueDBGrid
{
protected void OnScroll(EventArgs e)
{
if (e.Equals (EventArgs.Empty ))
//Place your code here.
Console.WriteLine("End Scroll");
}
//Verify if Scroll has ended.
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 0x115)
{
if ((ScrollEventType)(m.WParam.ToInt32() & 0xffff) == ScrollEventType.EndScroll )
{
OnScroll(EventArgs.Empty);
}
}
}
}
To use this custom component and considering you dragged and dropped C1TrueDbGrid from the VS Toolbox, change these lines within the form’s designer:
this.c1TrueDBGrid1 = new C1.Win.C1TrueDBGrid.C1TrueDBGrid();
private C1.Win.C1TrueDBGrid.C1TrueDBGrid c1TrueDBGrid1;
to
this.c1TrueDBGrid1 = new MyTDBG();
private MyTDBG c1TrueDBGrid1;
Save and close the window and rebuild the project. Should you need to verify BeginScroll, the actual C1TrueDbgrid_Scroll event is always there.
private void c1TrueDBGrid1_Scroll(object sender, C1.Win.C1TrueDBGrid.CancelEventArgs e)
{
//Your code needs to be implemented before Scroll begins.
}
Like I said earlier, Scroll event always returns values prior to the scroll. If I don't have a way to fetch final values, I simply can't synchronize another grid's scrollbar with the main C1TrueDbGrid. However, I can still outsource the job to a delegate I invoke from within the C1TrueDbGrid's Scroll event.
public delegate void InvokeDelegate();
object ActiveGrid;
private void c1TrueDBGrid1_Scroll(object sender, C1.Win.C1TrueDBGrid.CancelEventArgs e)
{
ActiveGrid = sender;
//Invoke delegate to create sync between grids.
this.BeginInvoke(new InvokeDelegate(SyncGrids));
}
private void SyncGrids()
{
foreach (Control ctrl in this.Controls)
{
//Set Horizontal and Vertical offsets of the second grid equal to the main grid.
if ((ctrl) is C1.Win.C1TrueDBGrid.C1TrueDBGrid)
{
(ctrl as C1.Win.C1TrueDBGrid.C1TrueDBGrid).Splits[0].HorizontalOffset = (ActiveGrid as C1.Win.C1TrueDBGrid.C1TrueDBGrid).Splits[0].HorizontalOffset;
(ctrl as C1.Win.C1TrueDBGrid.C1TrueDBGrid).Splits[0].VerticalOffset = (ActiveGrid as C1.Win.C1TrueDBGrid.C1TrueDBGrid).Splits[0].VerticalOffset;
}
}
}
We're good to scroll now:) A PFA sample that caters to both requirements is mentioned above. Download Sample