Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win


Drill down Reports. Using controls or drawing strings

Posted on 2009-05-05
Medium Priority
Last Modified: 2012-05-06
I have several Window Forms that display economical reports in my application. Due to the lack of speed of adding controls when the form is created, I draw the report values in the pain event in the forms.

Now, I'd like to add a drill down function and wonder what's the best way to go about. The reports normally displayes about 20 rows in 12 columns, (sometimes up to 36 columns though), so there are quite a few values.

Is there a way to add controls to a form in a quicker way?

If this is not possible, I guess I have to make my own table of positions to determine where the mouse is and to change the cursor when it is over a drawn string. The easiest way I can think of is to have an array(formposX,formposY) containing null or drilldownvalue depending on the strings. Anyone have a better solution?

Thanks in advance

Question by:ekenman
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
LVL 101

Expert Comment

ID: 24310903
What reporting tool?


Author Comment

ID: 24311951
No reporting tool, just Winform
LVL 83

Expert Comment

ID: 24312164
Are you just painting some labels on the form? Paint event is not the best place to do so. Can you show us some code? Is using Crystal Reports a viable option for you? These come free with .NET
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.


Author Comment

ID: 24323672
CodeCruiser, I'm just painting text, no labels since it is to slow to add controls. When the user change an option in the report, there might be more fields to display, so Crystal will not do it for me.

Below is some of the code from the paint event. I also paint rectangles and headers, but it's done in the same manner.

Reportarray holds the values from my sql-data. Canvas is the forms painteventargs.

Best Regards


            For Each item As Reportvalue In ReportArray
                If Not item Is Nothing Then
                    If item.Type <> ReportFieldType.CRLF Then
                        Dim temploc As Point
                        temploc.X = item.Location.X - hscrollpos - ColRightMargin
                        temploc.Y = item.Location.Y - vscrollpos
                        canvas.DrawString(item.Text, item.Font, Brushes.Black, temploc, format1)
                        temploc.X = item.Location.X - vscrollpos
                        If item.Type = ReportFieldType.CalculatedValue And item.Location.X = 342 Then
                            'Add a line
                            canvas.DrawLine(Pens.Black, 15 - hscrollpos, item.Location.Y - 2 - vscrollpos, (Reportperiods) * ColDistance + HeaderLeftMargin + HeaderWidth - 1 - hscrollpos, item.Location.Y - 2 - vscrollpos)
                        End If
                    End If
                End If

Open in new window

LVL 83

Expert Comment

ID: 24323753
Then the way to implement drilldown is to store the bounds of each text in a collection and on mouse move event, you would be matching the current x, y with stored bounds and if it happens to be within the bounds of a drill down enabled field then change the cursor to hand. Same would go for mouse click event.

Author Comment

ID: 24324738
So what kind of object would I use for the collection? Should I make my own object containing x,y, width and height and how do I compare it? Is there an object width a withinbounds method?
LVL 83

Accepted Solution

CodeCruiser earned 1500 total points
ID: 24325048
You would use a collection of rectangles. So lets say a text is occupying x1 = 10, y1 = 10, x2 = 20, y2 = 80
So you would put a condition like this

If (x>x1 and x<x2) and (y>y1 and y<y2) then
'within bounds.
end if

Featured Post

Enroll in October's Free Course of the Month

Do you work with and analyze data? Enroll in October's Course of the Month for 7+ hours of SQL training, allowing you to quickly and efficiently store or retrieve data. It's free for Premium Members, Team Accounts, and Qualified Experts!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Creating an analog clock UserControl seems fairly straight forward.  It is, after all, essentially just a circle with several lines in it!  Two common approaches for rendering an analog clock typically involve either manually calculating points with…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Are you ready to place your question in front of subject-matter experts for more timely responses? With the release of Priority Question, Premium Members, Team Accounts and Qualified Experts can now identify the emergent level of their issue, signal…
This lesson discusses how to use a Mainform + Subforms in Microsoft Access to find and enter data for payments on orders. The sample data comes from a custom shop that builds and sells movable storage structures that are delivered to your property. …

609 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question