Getting To Know Eu…ler

One of the best ways to get to know a programmer is to see their code. You might not know their favorite hobbies, favorite foods, or favorite football team (trick question, programmers don’t like football. Hehe), but getting a glimpse at how someone goes about solving problems can really be quite helpful.

With that in mind, I’m going to be taking part in ProjectEuler.net. It’s all math-based to one degree or another. I am horrible at math, really. I know enough to get by, but a lot of it I’ve forgotten since being out of school. But, I must admit, I love a figuring out puzzles — especially by programming — so I’m anxious to get started.

If you’d like to follow along, feel free to set up an account on their site and try the stuff out yourself. It can get quite addictive :)

Since I’m going to post code-samples here, I might as well include one of my “helper” routines I ended up using in a couple of solutions. Since a few of the problems involved prime numbers, I made a generic function for allowing me to determine whether a specific number is a prime or not.

I’m sure there are more effective ways of figuring out if a number is a prime, but math was never a subject a particularly excelled at…

```Function IsPrime(ByVal tmpVal As Long) As Boolean Dim strVal As String = tmpVal.ToString```

``` 'If the number ends in 0,2,4,5,6,8 then it's NOT prime (might be a composite) If strVal.Length > 1 AndAlso strVal.Substring(strVal.Length - 1, 1) = "0" Then Return False If strVal.Length > 1 AndAlso strVal.Substring(strVal.Length - 1, 1) = "2" Then Return False If strVal.Length > 1 AndAlso strVal.Substring(strVal.Length - 1, 1) = "4" Then Return False If strVal.Length > 1 AndAlso strVal.Substring(strVal.Length - 1, 1) = "5" Then Return False If strVal.Length > 1 AndAlso strVal.Substring(strVal.Length - 1, 1) = "6" Then Return False If strVal.Length > 1 AndAlso strVal.Substring(strVal.Length - 1, 1) = "8" Then Return False 'Except for the number 2, if a number is even, it's always composite If tmpVal <> 2 AndAlso tmpVal Mod 2 = 0 Then Return False 'If a number's digits add up to a number which is divisible by 3, it's composite Dim tmpDigitSum As Integer = 0 If strVal.Length > 1 Then For k As Integer = 0 To strVal.Length - 1 tmpDigitSum += strVal.Substring(k, 1) Next If tmpDigitSum = 3 Then Return False End If 'If a number's square root is an integer, it's a composite If System.Math.Sqrt(tmpVal) = CInt(System.Math.Sqrt(tmpVal)) Then Return False 'If it's not divisible by itself, it's not Prime If tmpVal Mod tmpVal <> 0 Then Return False Dim MaxVal As Long = System.Math.Sqrt(tmpVal) For k As Long = 2 To MaxVal If tmpVal Mod k = 0 AndAlso k <> 1 Then Return False End If Next ```

``` Return True End Function```

Close Enough

I was able to finally get the table structure the way I wanted it.

Since my source data is all plain text, I identify the URLs and then add in the HREF data with the url as the link text as well as the location. Add in basic tags for displaying the images I want next to the next and — BAM! — now I have a grid showing the posts/pictures for each user.

Once that was in place, I did something similar for usernames.

Last but not least, I hijacked the DocumentCompleted event of the browser control to add an OnClick event for each link… That event lets me selectively perform actions based on what I need… So clicking on a normal URL will open up a new browser window displaying what’s needed. Clicking on the image link (the user pic) performs some stuff on the client side to allow replying to that person’s post.

It’ll make a bit more sense once I post some pics…

More than one way to skin a cat…

Needed to display some data in a grid. No biggie. But I wanted some custom formatting — mainly allowing for links and whatnot. Eventually, I was left with two options — inheriting a richtextbox control and using that as a custom datagridcolumn or doing an override on a paint event for the cell…

Started with the richtextbox method, but it seemed like the only way that worked was if the editing control was overridden… Not much use for displaying the stuff. Meh.

So I tried out using the paint event. That actually worked pretty good at first. Using GDI+ DrawString calls to write what I wanted in the color/formatting I wanted — albeit in a somewhat clumsy way. But then I began running into issues when I had multiple strings needing formatting or if the string needed to wrap within the cell.

Deciding both method were way too complex for what I needed, I started rethinking the issue. What I really needed was a way to have it render HTML text. That way I could do some handy-wavy string manipulations to set the various tags I needed and that would be all that’s needed.

After looking around for a while for a simple way of doing that within the datagridview, I changed my design plan a bit…

That’s when I got an idea…

If I used a web browser control, I’d certainly have the HTML support I needed. And by using tables within HTML, I’d be able to get pretty close to the same grid feel as that original datagridview.