[SOLVED] Where am I wrong now? (selectionbycolumn)
Printed From: Codejock Forums
Category: Codejock Products
Forum Name: Report Control
Forum Description: Topics Related to Codejock Report Control
URL: http://forum.codejock.com/forum_posts.asp?TID=17374
Printed Date: 05 October 2024 at 2:21am Software Version: Web Wiz Forums 12.04 - http://www.webwizforums.com
Topic: [SOLVED] Where am I wrong now? (selectionbycolumn)
Posted By: Albert1
Subject: [SOLVED] Where am I wrong now? (selectionbycolumn)
Date Posted: 05 October 2010 at 3:37am
I am looking for substitute the "old" tdbgrid/vsflex with CJ ReportControl but, for each feature I resolve, two problems raise...
The last one:
In a new form, insert a ReportControl and paste this code:
Option Explicit
Private Sub Form_Load() Dim i As Integer, j As Integer
Width = 7200 Height = 4500
With ReportControl For i = 0 To 5 .Columns.Add i, "Col " & Chr$(65 + i), 150, False Next i For i = 0 To 20 With .Records.Add For j = 0 To 5 .AddItem Chr$(65 + j) Next j End With Next i .Populate End With
End Sub
Private Sub Form_Resize() ReportControl.Move 0, 0, ScaleWidth, ScaleHeight End Sub
Private Sub ReportControl_MouseDown(Button As Integer, Shift As Integer, x As Long, y As Long) If ReportControl.HitTest(x, y).ht = xtpHitTestReportArea Then Debug.Print "HitTest: ReportArea" ElseIf ReportControl.HitTest(x, y).ht = xtpHitTestUnknown Then Debug.Print "HitTest: Unknown" End If End Sub
|
Run it. As you can see you can click the column A, B or C (the debug window states you are in the ReportArea).
Now, use the mouse and the horizontal scrollbar to show columns D,E and F. Click over the report control. You cannot select nothing (the debug window states you are in a Unknown Area, i.e. "no part of the ReportControl is at the given X and Y coordinates").
Set full screen and you can see you can select what you want.
This is a very basic grid behaviour. The basic grid included in VB about 15 years ago did this the corect way.
Am I the only one that use this or am I not able to understand this control?
TY
------------- Product: Xtreme SuitePro (ActiveX) version 13.4.1 / 16.3.0
Platform: Windows Vista (32bit) - SP 2
Language: Visual Basic 6.0 (SP6)
|
Replies:
Posted By: jpbro
Date Posted: 05 October 2010 at 8:51am
Looks like a bug with AutoColumnSizing = True when there are no auto-sizable columns.
Try putting .AutoColumnSizing = False in your Form_Load event immediately before you add your columns.
Also, please open a support ticket at https://support.codejock.com so
that there is a chance that this will be fixed for the next release.
If Aaron is reading - perhaps you could add this to your bug list?
Thanks.
------------- Product: Xtreme SuitePro (ActiveX) version 16.2.6 Platform: Windows XP - SP3
Language: Visual Basic 6.0 SP6
|
Posted By: Albert1
Date Posted: 05 October 2010 at 9:59am
jpbro wrote:
Looks like a bug with AutoColumnSizing = True when there are no auto-sizable columns.
Try putting .AutoColumnSizing = False in your Form_Load event immediately before you add your columns.
|
I dont know how you found this hack but ... it works! I have spent about one day over this.
I am trying to implement a way to select a column. In the past I did this with a single statement:
VsFlex.SelectionMode = flexSelectionByColumn |
Now I need to use
ReportControl .SetCustomDraw xtpCustomDrawItem
|
and the ReportControl_DrawItem event to paint the column items.
So with this code (working now)
With ReportControl
If .HitTest(X, Y).ht = xtpHitTestReportArea Then Set .FocusedColumn = .HitTest(X, Y).Column Set .FocusedRow = .HitTest(X, Y).Row End If
End With
|
I can set the FocusedColumn and:
ReportControl_DrawItem()
If Column.Index = rpt.FocusedColumn.Index Then Item.BackColor = vbRed Else Item.BackColor = vbWhite End If End Sub
|
I reach the goal. But another bug is that I cannot use:
ReportControl.SelectionEnable = False
|
why the event will be raised only the second click ... The arrow keys are not fully working ...
Its a true neverending story ...
BTW: why there is no method to programmatically repaint the visible part of the ReportControl? Like the standard Visual Basic Refresh? (Redraw doesnt work).
jpbro wrote:
Also, please open a support ticket at https://support.codejock.com so that there is a chance that this will be fixed for the next release.
|
I did it this morning (for me) after this post.
Thank you!
------------- Product: Xtreme SuitePro (ActiveX) version 13.4.1 / 16.3.0
Platform: Windows Vista (32bit) - SP 2
Language: Visual Basic 6.0 (SP6)
|
Posted By: Aaron
Date Posted: 05 October 2010 at 2:36pm
Hi,
Focused column color:
With wndReportControl .PaintManager.ShadeSortColumn = True .PaintManager.ShadeSortColor = vbYellow
End With
Question:
I reach the goal. But another bug is that I cannot use:
ReportControl.SelectionEnable = False
|
why the event will be raised only the second click ... The arrow keys are not fully working ...
Answer:
What are you trying to accomplish?
Question:
BTW: why there is no method to programmatically repaint the visible part of the ReportControl? Like the standard Visual Basic Refresh? (Redraw doesnt work).
Answer:
-
Description
Redraws the mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportControl.html - ReportControl
Syntax
Public Sub Redraw()
Remarks
This method needs to be called any time you change a property in the mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportControl~PaintManager.html - ReportPaintManager . This is required to redraw the visual changes that you make to the mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportControl.html - ReportControl . For example, you would need to call the Redraw method after you change the grid line style.
-
Description
Populates the mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportControl.html - ReportControl 's with mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportRow.html - ReportRow collection with the data contained in the mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportRecord.html - ReportRecord s
Syntax
Public Sub Populate()
Remarks
mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportRows.html - ReportRows (which are associated with a mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportRecord.html - ReportRecord ) will not be added to the mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportControl.html - ReportControl 's view until the Populate method is called.
The changes made to the mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportControl~GroupsOrder.html - GroupsOrder or mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportControl~SortOrder.html - SortOrder collections will only take effect after the Populate method is called.
Populate can be called after each record is added, or after you are done adding all records. If at any time you mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportRecords~Add.html - add or mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportRecords~RemoveAt.html - delete mk:@MSITStore:C:%5CProgram%20Files%5CCodejock%20Software%5CActiveX%5CXtreme%20SuitePro%20ActiveX%20v13.4.1%5CHelp%5CSymbolReference.chm::/XtremeReportControl~ReportRecord.html - ReportRecords , the changes will not be visible until the Populate method is called.
So any changes made in Record Collection (adding or removing) you have to call .Populate otherwise changes don't show. Changing "Visual properties" need .Redraw method.
btw Do not hesitate to post your problems, there's always someone to help you a little further. I know ReportControl is an advanced control when you start using it, I know, I have been there I believe it's a great control once you know how to use it (and problems are solved in near future...)
------------- Product: Xtreme SuitePro (ActiveX) version 15.0.2
Platform: Windows XP (32bit) - SP 2
Language: Visual Basic 6.0
Zero replies is not an option....
|
Posted By: Albert1
Date Posted: 06 October 2010 at 4:25am
Thank you Aaron for the suggestions,
Aaron wrote:
Focused column color:
With wndReportControl .PaintManager.ShadeSortColumn = True .PaintManager.ShadeSortColor = vbYellow
End With
|
I dont want the user can sort the columns. So I cannot use this approach.
I wish to substitute this "old" grid with a new themed grid:
The user can browse through models details using the mouse and/or the keyboard. There is allways a selected column. If the user wants, he can click on OK and the model is selected for the main form.
I can reach this with really little code using vsflex:
I set:
vsFlex.SelectionMode = flexSelectionByColumn
|
and only 1 event
Private Sub vsFlex_RowColChange() m_SelectedCol = vs.Col End Sub
|
Thats all I need!!!
Further I can set:
this way the first two column are really "fixed" and you cannot reach them with keyboard (this is asked by many people in this forum ...)
Aaron wrote:
Public Sub Redraw()
Remarks This method needs to be called any time you change a property in the ReportPaintManager....
Public Sub Populate()
Remarks
ReportRows(which are associated with a ReportRecord) will not be added ...
|
I know this methods but they are not enough (if I am not wrong). Please check this code:
Option Explicit
Dim m_SelectedCol As Integer Private Sub Form_Load() Dim i As Integer, j As Integer Width = 7200 Height = 4500 With ReportControl .AutoColumnSizing = False .FocusSubItems = True .SetCustomDraw xtpCustomDrawItem For i = 0 To 5 .Columns.Add i, "Col " & Chr$(65 + i), 150, False Next i For i = 0 To 20 With .Records.Add For j = 0 To 5 .AddItem Chr$(65 + j) Next j End With Next i .Populate End With End Sub Private Sub Form_Resize() ReportControl.Move 0, 0, ScaleWidth, ScaleHeight End Sub Private Sub ReportControl_DrawItem(ByVal Row As XtremeReportControl.IReportRow, ByVal Column As XtremeReportControl.IReportColumn, ByVal Item As XtremeReportControl.IReportRecordItem, ByVal hDC As stdole.OLE_HANDLE, ByVal left As Long, ByVal top As Long, ByVal right As Long, ByVal bottom As Long, DoDefault As Boolean) If Column.Index = m_SelectedCol Then Item.BackColor = vbYellow Else Item.BackColor = vbWhite End If End Sub Private Sub ReportControl_FocusChanging(ByVal NewRow As XtremeReportControl.IReportRow, ByVal NewColumn As XtremeReportControl.IReportColumn, ByVal NewItem As XtremeReportControl.IReportRecordItem, Cancel As Boolean) m_SelectedCol = NewColumn.Index End Sub
|
Run it. You can observe that:
1) The selected cell is "Col B", first row. Just curiosity. Why not "Col A"?
2) The event DrawItem is raised but nothing happens. Why?
3) Press the right arrow key. DrawItem set yellow in the first column?
From the help of DrawItem method:
Column The ReportColumn that that contains the items that is currently being drawn.
So my code is valid.
4) Press again the right arrow key. DrawItem event set yellow to Col C (btw the focus is on Col D)
5) Press left and/or right arrow key ... You will see.
Remarks
If I had a Refresh method I could call when I want to do it, my problems were done? Or not?
In your opinion, should I have to open a ticket? I have subscription too.
Aaron wrote:
I know ReportControl is an advanced control when you start using it, I know, I have been there I believe it's a great control once you know how to use it (and problems are solved in near future...)
|
Thank you Aaron. Btw I am not so noob ;). I can be noob with english language but not with VB language . I dont fully agree with you about RC is a great control. I am using it for more than 2 years and I can do only simple works. I am not still able to fully substitute a TDBgrid and/or VSFlex. I hope for the next future (but it seems CJ wants to upgrade markup instead of RC ).
------------- Product: Xtreme SuitePro (ActiveX) version 13.4.1 / 16.3.0 Platform: Windows Vista (32bit) - SP 2 Language: Visual Basic 6.0 (SP6)
|
Posted By: Aaron
Date Posted: 06 October 2010 at 5:14am
Hi,
Please one thing at a time If this has been solved we will move to next "problem", OK?
Column selection problem:
- Add columns that aren't sortable (if you don't want users to sort it of course)
- Add wndReportControl.PaintManager.DrawSortTriangleAlways = False
- Add wndReportControl.PaintManager.DrawSortTriangleStyle = xtpReportDrawSortTriangleNever 'Doesn't draw sort icon in column)
Add MouseDown event (this because FocusChanging isn't returning NewColumn and NewItem object GRRRRRR............. I tried with V13.4.1 )
Well to have a solution for you:
Private Sub wndReportControl_MouseDown(Button As Integer, Shift As Integer, x As Long, y As Long) Me.wndReportControl.SortOrder.DeleteAll Me.wndReportControl.SortOrder.Add Me.wndReportControl.HitTest(x, y).Column End Sub
Well, if this helps you a little, we go to the next level
------------- Product: Xtreme SuitePro (ActiveX) version 15.0.2
Platform: Windows XP (32bit) - SP 2
Language: Visual Basic 6.0
Zero replies is not an option....
|
Posted By: Aaron
Date Posted: 06 October 2010 at 8:02am
Hi,
OK, I created test for you and keep this project to get answers for your other problems.
http://forum.codejock.com/uploads/3701/TestAlbert1.zip - uploads/3701/TestAlbert1.zip
------------- Product: Xtreme SuitePro (ActiveX) version 15.0.2
Platform: Windows XP (32bit) - SP 2
Language: Visual Basic 6.0
Zero replies is not an option....
|
Posted By: Albert1
Date Posted: 06 October 2010 at 8:03am
Solved!
Thanks Aaron. This is the result:
A "whole new world" with vista look
This is the code I used for (if some1 needs it):
Private Sub Form_Load() With ReportControl .BorderStyle = xtpBorderThemedFrame .Move 120, 120
.AllowColumnRemove = False .AllowColumnReorder = False ' .AllowColumnResize = False .AllowColumnSort = False .AllowEdit = False
.EnableMarkup = True .EditOnClick = False .FastDeselectMode = True .FocusSubItems = True .FullColumnScrolling = True
.HeaderRowsAllowEdit = False .InitialSelectionEnable = True .MultipleSelection = False .RightToLeft = False .SelectionEnable = True .ShowHeader = True .ShowHeaderRows = False .ShowRowFocus = False .SetCustomDraw xtpCustomDrawItem
With .PaintManager .ShowNonActiveInPlaceButton = False .ColumnStyle = xtpColumnShaded ' Excel 2007 colors .CaptionBackGradientColorLight = RGB(&HF9, &HFC, &HFD) .CaptionBackGradientColorDark = RGB(&HD3, &HDB, &HE9) .GridLineColor = RGB(&HD0, &HD7, &HE5) ' .VerticalGridStyle = xtpGridSolid .ColumnHotGradientColorDark = .CaptionBackGradientColorDark .ColumnHotGradientColorLight = .CaptionBackGradientColorLight .ColumnPushedGradientColorDark = .ColumnHotGradientColorLight .ColumnPushedGradientColorLight = .ColumnHotGradientColorDark .InvertColumnOnClick = False
.FreezeColsDividerStyle = xtpReportFreezeColsDividerHeader .FixedRowHeight = False .HideSelection = True .GrayIfDisable = False .ForceDynamicMarkupForCell = True ' .CaptionFont = gFontName ' .TextFont = gFontName End With ' .Redraw
End With
With ReportControl .AutoColumnSizing = False ' to resolve bug .SelectionEnable = False .PaintManager.ShadeSortColumn = True .PaintManager.ShadeSortColor = RGB(&HBF, &HDB, &HFF) .PaintManager.DrawSortTriangleAlways = False .PaintManager.DrawSortTriangleStyle = xtpReportDrawSortTriangleNever 'Doesn't draw sort icon in column .StrictBestFit = False
' ' Populate RecordControl ' for col 0 and 1 set Item.BackColor = ReportControl.PaintManager.CaptionBackColor '
.Populate .FreezeColumnsCount = 2
' autosize columns For i = .FreezeColumnsCount To .Columns.Count - 1 .Columns(i).BestFitMode = xtpBestFitModeAllData .Columns(i).Resizable = True .Columns(i).BestFit .Columns(i).Resizable = False Next
End With
End Sub
Private Sub ReportControl_FocusChanging(ByVal NewRow As XtremeReportControl.IReportRow, ... , Cancel As Boolean) If Not NewColumn Is Nothing Then If NewColumn.Index >= ReportControl.FreezeColumnsCount Then ReportControl.SortOrder.DeleteAll ReportControl.SortOrder.Add NewColumn Else Cancel = True End If End If End Sub
Private Sub ReportControl_MouseDown(Button As Integer, Shift As Integer, X As Long, Y As Long) Dim NewColumn As ReportColumn If ReportControl.HitTest(X, Y).ht = xtpHitTestReportArea Then Set NewColumn = ReportControl.HitTest(X, Y).Column If NewColumn.Index >= ReportControl.FreezeColumnsCount Then ReportControl.SortOrder.DeleteAll ReportControl.SortOrder.Add NewColumn End If End If End Sub
|
I cannot think I can Select a column using a "sort-like" property. But it works.
I need to use checks over FreezeColumnsCount. A new property FixedColumnsCount would be appreciated .
Again, thank you all.
------------- Product: Xtreme SuitePro (ActiveX) version 13.4.1 / 16.3.0
Platform: Windows Vista (32bit) - SP 2
Language: Visual Basic 6.0 (SP6)
|
Posted By: Aaron
Date Posted: 06 October 2010 at 8:24am
Hi,
If you check my test project, you don't need MouseDown event to get this working. I used that so you can see that it is working. (FocusChange event didn't return NewColumn and NewItem because (I think...) 2 versions were installed and I didn't uninstall previous version) But you can use FocusChange event for this and remove MouseDown event.
I also see that you didn't set .Sortable = False for the columns? If you don't set it to false, your users are able to sort by clicking on column.
------------- Product: Xtreme SuitePro (ActiveX) version 15.0.2
Platform: Windows XP (32bit) - SP 2
Language: Visual Basic 6.0
Zero replies is not an option....
|
Posted By: Albert1
Date Posted: 06 October 2010 at 8:47am
Aaron wrote:
Hi,
If you check my test project, you don't need MouseDown event to get this working. I used that so you can see that it is working.
|
Yes, you are right (to duplicate code is for noobs ).
I noticed now you posted it 1 minute before me. I removed the mousedown event and its working anyway.
Aaron wrote:
Hi,
I also see that you didn't set .Sortable = False for the columns? If you don't set it to false, your users are able to sort by clicking on column. |
Its set .AllowColumnSort = False at ReportControl level to lock. It works fine. ------------- Product: Xtreme SuitePro (ActiveX) version 13.4.1 / 16.3.0 Platform: Windows Vista (32bit) - SP 2 Language: Visual Basic 6.0 (SP6)
|
|