Company Catalog - DataGrid

Posted on 2005-05-17
Last Modified: 2008-03-03
I have an XML file with all of the company products.  I have loaded that into a dataset.  I now want to put that into a datagrid and have it properly formated (some columns are hyperlinks, some are pictures, etc).  Are there any good tutorials on how to do that?  Basically I want to create a catalog of products.
Question by:NeoTek
    LVL 27

    Expert Comment

    Here is a sample with images in datagrid.... you will have to add alot to get all the things that you want in the datagrid.....

    'FORM 1

    Imports System
    Imports System.Drawing
    Imports System.Collections
    Imports System.ComponentModel
    Imports System.Windows.Forms
    Imports System.Data

    Public Class Form1
        Inherits System.Windows.Forms.Form

        Private topPos As Integer
        Private nRows As Integer = 5
        Private bitMaps As ArrayList
        Private WithEvents dataGrid1 As System.Windows.Forms.DataGrid
    #Region "Windows Form Designer generated code"
        Public Sub New()
            ' Required for Windows Form Designer support
        End Sub 'New
        ' TODO: Add any constructor code after InitializeComponent call
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                End If
            End If
        End Sub 'Dispose

        '/ <summary>
        '/ Required method for Designer support - do not modify
        '/ the contents of this method with the code editor.
        '/ </summary>
        Friend WithEvents ImageList1 As System.Windows.Forms.ImageList
        Private components As System.ComponentModel.IContainer
        Private Sub InitializeComponent()
            Me.components = New System.ComponentModel.Container
            Me.dataGrid1 = New System.Windows.Forms.DataGrid
            Me.ImageList1 = New System.Windows.Forms.ImageList(Me.components)
            CType(Me.dataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
            Me.dataGrid1.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
                        Or System.Windows.Forms.AnchorStyles.Left) _
                        Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
            Me.dataGrid1.DataMember = ""
            Me.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText
            Me.dataGrid1.Location = New System.Drawing.Point(20, 12)
            Me.dataGrid1.Name = "dataGrid1"
            Me.dataGrid1.Size = New System.Drawing.Size(216, 152)
            Me.dataGrid1.TabIndex = 0
            Me.ImageList1.ImageSize = New System.Drawing.Size(16, 16)
            Me.ImageList1.TransparentColor = System.Drawing.Color.Transparent
            Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
            Me.ClientSize = New System.Drawing.Size(248, 173)
            Me.Name = "Form1"
            Me.Text = "Form1"
            CType(Me.dataGrid1, System.ComponentModel.ISupportInitialize).EndInit()

        End Sub 'InitializeComponent
    #End Region
        '/ <summary>
        '/ The main entry point for the application.
        '/ </summary>
        <STAThread()> _
        Shared Sub Main()
            Application.Run(New Form1)
        End Sub
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

            'create a datatable
            Dim dt As New DataTable("MyTable")

            dt.Columns.Add(New DataColumn("Col0"))
            dt.Columns.Add(New DataColumn("Images", GetType(Integer)))

            Dim r As New Random
            Dim i As Integer

            For i = 0 To nRows - 1
                Dim dr As DataRow = dt.NewRow()
                dr(0) = String.Format("row{0}", i)
                dr(1) = r.Next(4)

            'store bitmaps in an arraylist
            bitMaps = New ArrayList
            Dim executing_assembly As System.Reflection.Assembly = Me.GetType.Assembly.GetEntryAssembly()
            ' Get the namespace.
            Dim my_namespace As String = executing_assembly.GetName().Name.ToString()
            Dim strm As System.IO.Stream
            strm = [GetType]().Assembly.GetManifestResourceStream(my_namespace & ".Blue hills.jpg")
            bitMaps.Add(New Bitmap(strm))
            strm = [GetType]().Assembly.GetManifestResourceStream(my_namespace & ".Sunset.jpg")
            bitMaps.Add(New Bitmap(strm))
            strm = [GetType]().Assembly.GetManifestResourceStream(my_namespace & ".Water lilies.jpg")
            bitMaps.Add(New Bitmap(strm))
            strm = [GetType]().Assembly.GetManifestResourceStream(my_namespace & ".Winter.jpg")
            bitMaps.Add(New Bitmap(strm))
            strm = [GetType]().Assembly.GetManifestResourceStream(my_namespace & ".DirtRoad.jpg")
            bitMaps.Add(New Bitmap(strm))

            'OR Use this
            'bitMaps.Add(New Bitmap(SystemIcons.Warning.ToBitmap()))
            'bitMaps.Add(New Bitmap(SystemIcons.Application.ToBitmap()))
            'bitMaps.Add(New Bitmap(SystemIcons.Asterisk.ToBitmap()))
            'bitMaps.Add(New Bitmap(SystemIcons.Error.ToBitmap()))
            'bitMaps.Add(New Bitmap(SystemIcons.Exclamation.ToBitmap()))
            'bitMaps.Add(New Bitmap(SystemIcons.Hand.ToBitmap()))

            Dim tableStyle As New DataGridTableStyle
            tableStyle.MappingName = "MyTable"
            Dim tbc As New DataGridTextBoxColumn
            tbc.MappingName = "Col0"
            tbc.HeaderText = "Column 1"
            tbc.Width = 50

            Dim width As Integer = Me.dataGrid1.ClientSize.Width - tbc.Width - Me.dataGrid1.RowHeaderWidth - 4
            Dim tbc1 As New DataGridImageCell
            tbc1.MappingName = "Images"
            tbc1.HeaderText = "Images"
            Dim h As ImageList.ImageCollection
            tbc1.theImages = bitMaps
            tbc1.Width = width

            Me.dataGrid1.DataSource = dt
            dt.DefaultView.AllowNew = False

            Dim rect As Rectangle = Me.dataGrid1.GetCellBounds(0, 0)
            topPos = rect.Top
            Dim height As Integer = (Me.dataGrid1.ClientSize.Height - topPos - nRows) / nRows
            tableStyle.PreferredRowHeight = height
            Me.dataGrid1.DataSource = Nothing
            Me.dataGrid1.DataSource = dt
        End Sub
        Private Sub dataGrid1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dataGrid1.SizeChanged
            Dim height As Integer = (Me.dataGrid1.ClientSize.Height - topPos - nRows) / nRows
            Dim tableStyle As DataGridTableStyle = Me.dataGrid1.TableStyles("MyTable")

            If Not tableStyle Is Nothing Then
                Dim width As Integer = Me.dataGrid1.ClientSize.Width - tableStyle.GridColumnStyles("Col0").Width - Me.dataGrid1.RowHeaderWidth - 4

                tableStyle.GridColumnStyles("Images").Width = width

                tableStyle.PreferredRowHeight = height
                Dim o As Object = Me.dataGrid1.DataSource
                Me.dataGrid1.DataSource = Nothing
                Me.dataGrid1.DataSource = o
            End If
        End Sub
    End Class


    Imports System
    Imports System.Windows.Forms
    Imports System.Drawing
    Imports System.Data
    Imports System.Collections
    '/ <summary>
    '/ Summary description for DataGridImageCell.
    '/ </summary>

    Public Class DataGridImageCell
       Inherits DataGridTextBoxColumn
       Private theImages1 As ArrayList
        Public Sub New()
        End Sub
        Public Property theImages() As ArrayList
                Return theImages1
            End Get
            Set(ByVal Value As ArrayList)
                theImages1 = Value
            End Set
        End Property
        Protected Overloads Overrides Sub Edit(ByVal [source] As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal bounds As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)
            'overriden to avoid editing
        End Sub
        Public Enum GridImageCellDrawOption
            FitToCell = 0
            NoResize = 1
            FitProportionally = 2
        End Enum
        Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal [source] As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal backBrush As System.Drawing.Brush, ByVal foreBrush As System.Drawing.Brush, ByVal alignToRight As Boolean)
            Dim o As Object = Me.GetColumnValueAtRow([source], rowNum)
            If Not (o Is Nothing) Then
                Dim i As Integer = Fix(o)
                g.FillRectangle(backBrush, bounds)

                Dim bmp As Bitmap = CType(theImages(i), Bitmap)

                'GridImageCellDrawOption cellDrawOption = GridImageCellDrawOption.NoResize;
                'GridImageCellDrawOption cellDrawOption = GridImageCellDrawOption.FitProportionally;
                Dim cellDrawOption As GridImageCellDrawOption = GridImageCellDrawOption.FitToCell

                Dim gu As System.Drawing.GraphicsUnit = System.Drawing.GraphicsUnit.Point

                Dim srcRect As RectangleF = bmp.GetBounds(gu)
                Dim destRect As Rectangle = Rectangle.Empty

                Dim saveRegion As [Region] = g.Clip

                Select Case cellDrawOption
                    Case GridImageCellDrawOption.FitToCell
                        destRect = bounds
                    Case GridImageCellDrawOption.NoResize
                        destRect = New Rectangle(bounds.X, bounds.Y, Fix(srcRect.Width), Fix(srcRect.Height))
                        g.Clip = New [Region](bounds)
                    Case GridImageCellDrawOption.FitProportionally
                        If (True) Then
                            Dim srcRatio As Single = srcRect.Width / srcRect.Height
                            Dim tarRatio As Single = System.Convert.ToSingle(bounds.Width) / bounds.Height
                            destRect = bounds
                            If tarRatio < srcRatio Then
                                destRect.Height = Fix(destRect.Width * srcRatio)
                                destRect.Width = Fix(destRect.Height * srcRatio)
                            End If
                        End If

                    Case Else
                End Select

                If Not destRect.IsEmpty Then
                    'g.DrawImage(bmp, destRect, srcRect, gu)
                    Dim destRectF As New RectangleF(destRect.X, destRect.Y, destRect.Width, destRect.Height)
                    Dim srcRectF As New RectangleF(srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height)

                    g.DrawImage(bmp, destRectF, srcRectF, gu)
                End If
                g.Clip = saveRegion
            End If
        End Sub

    End Class
    LVL 27

    Expert Comment

    You will have to setup a class for each different type of cell (ei images, buttons, links, etc.)
    LVL 1

    Author Comment

    Would it be easier to do it with a datatable?
    LVL 1

    Author Comment

    What I'm basically trying to do is create an ecommerce site.  Do you know of any good tutorials that can lead me on my way?
    LVL 27

    Accepted Solution


    Here is where I found good examples for getting started in VB.Net
    and in the ASP kits  there is a ecommerce app..


    Link for ASP programs...


    Featured Post

    IT, Stop Being Called Into Every Meeting

    Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

    Join & Write a Comment

    Since .Net 2.0, Visual Basic has made it easy to create a splash screen and set it via the "Splash Screen" drop down in the Project Properties.  A splash screen set in this manner is automatically created, displayed and closed by the framework itsel…
    Introduction When many people think of the WebBrowser ( control, they immediately think of a control which allows the viewing and navigation of web pages. While this is true, it's a…
    Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…
    Here's a very brief overview of the methods PRTG Network Monitor ( offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…

    729 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

    Need Help in Real-Time?

    Connect with top rated Experts

    20 Experts available now in Live!

    Get 1:1 Help Now