Company Catalog - DataGrid

Posted on 2005-05-17
Medium Priority
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
  • 3
  • 2
LVL 27

Expert Comment

ID: 14018282
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.....


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

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

Author Comment

ID: 14018603
Would it be easier to do it with a datatable?

Author Comment

ID: 14020409
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

planocz earned 1000 total points
ID: 14026483

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

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

Question has a verified solution.

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

Article by: Jorge
XML Literals are a great way to handle XML files and the community doesn’t use it as much as it should.  An XML Literal is like a String (http://msdn.microsoft.com/en-us/library/system.string.aspx) Literal, only instead of starting and ending with w…
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
The Relationships Diagram is a good way to get an overall view of what a database is keeping track of. It is also where relationships are defined. A relationship specifies how two tables connect to each other. As you build tables in Microsoft Ac…
How can you see what you are working on when you want to see it while you to save a copy? Add a "Save As" icon to the Quick Access Toolbar, or QAT. That way, when you save a copy of a query, form, report, or other object you are modifying, you…

601 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