[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

Error with datagridviewcombobox

Posted on 2009-02-21
13
Medium Priority
?
1,453 Views
Last Modified: 2012-05-06
Hi Experts,

I am having a problem (error) with a datagridviewcombobox.

I select an option from the conbobox in the DGV and I then add some characters to the characters that are already there. It errors...

http://www.screencast.com/users/si2030/folders/Jing/media/d15a2fd8-362b-4696-9485-1ab819a91657

It says value '' cannot be converted to type system.string...  it seems to think there is nothing there and then it says where..

I just cant understand why this causes an error and also how to stop it from happening...

I cannot even run the debugger to find the error... or capture it with a try catch statement.

Could someone tell me whats wrong - there appears to be characters in the box... and how to avoid getting this error.

Kind Regards

Simon
0
Comment
Question by:si2030
  • 8
  • 5
13 Comments
 
LVL 27

Expert Comment

by:Dabas
ID: 23702546
The error actually points to the next step in your solution:

".... handle the DataError event"

Does it always happen after you type the second character?

Dabas
0
 

Author Comment

by:si2030
ID: 23704207
Hi Dabas

I tried just typing one character and it still does it...

I had the idea to stop the user from clicking within the string displayed when in a currentcell...

The fact is I can remove all values within that combobox IF then click in another cell and then back into this one but I cant seem to clear the contents if the cell is the current cell and I click again on it...

Would you or another know how to force this to occur as this I think would solve the problem above.

http://www.screencast.com/users/si2030/folders/Jing/media/bf1e1886-e9c4-4bcd-b376-65e3dfa7d7ef


Private Sub dgvCreditorInvoiceDetail_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvCreditorInvoiceDetail.EditingControlShowing
 
        If dgvCreditorInvoiceDetail.CurrentCellAddress.X = accountComboBox.DisplayIndex Then
 
            Dim cmb As ComboBox = CType(e.Control, ComboBox)
 
            'AddHandler cmb.a, AddressOf cmbSelectedIndexChanged
 
            cmb.AutoCompleteMode = AutoCompleteMode.SuggestAppend
            cmb.AutoCompleteSource = AutoCompleteSource.ListItems
 
            'This clears the cell when you first click on it or click back onto it.....
            dgvCreditorInvoiceDetail.Item(dgvCreditorInvoiceDetail.CurrentCellAddress.X, dgvCreditorInvoiceDetail.CurrentCellAddress.Y).Value = ""
 
            If Not cmb Is Nothing Then
 
                cmb.DropDownStyle = ComboBoxStyle.DropDown
 
                cmb.SelectedIndex = -1
 
            End If
 
        End If
 
    End Sub

Open in new window

0
 

Author Comment

by:si2030
ID: 23704590
Ok I have commented out practically all my code save just the EditingControlShowing event which I need to make this an editable datagridviewcombobox.

I have also removed the displaymember and valuemember leaving just a simple binding for the DGVcombobox.

Same error different error screen.
DATAGRIDVIEW-ERROR.jpg
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
LVL 27

Expert Comment

by:Dabas
ID: 23706052
Have you tried my suggestion of handling the DataError Event?

It might not solve the problem, but will probably give you more information about its cause
0
 

Author Comment

by:si2030
ID: 23707382
How would you do that... I'd like to but I am unsure where you would capture that..?
0
 
LVL 27

Accepted Solution

by:
Dabas earned 1500 total points
ID: 23709655
Try something like in this snippet
    Private Sub DdgvCreditorInvoiceDetailataGridView1_DataError(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DdgvCreditorInvoiceDetailataGridView1.DataError
        MessageBox.Show(e.Exception.ToString() & vbCrLf & "RowIndex =" & e.RowIndex)
        
        Dim ErrContext As DataGridViewDataErrorContexts = e.Context
        'Set  a breakpoint here to check what context is causing the error. It might give you further clues
    End Sub

Open in new window

0
 

Author Comment

by:si2030
ID: 23709920
Hi Dabas

I pasted the snippet in. It did fire and the message box displayed.

The value for ErrContext = 4864.

Not sure what that means... had a look on the web and its a type missmatch of some sort...
0
 

Author Comment

by:si2030
ID: 23711233
Hey just tried this... see code.
It appears that even though the cell has a value the cell value is equal to nothing...

Its like the contents are being tested as a whole and the displaymember (text) does not equate to any of the drop downs in the list and therefore there is no equvalent value and so an error occurs...

The error occurs straight after cellvalidation... I have included this below... The fact is the try catch statement doesnt capture it and its to do with the value...

It seems it needs to always match something in  the list... the question is, how would you capture that in the cell validating event and stop it??
Private Sub DdgvCreditorInvoiceDetailataGridView1_DataError(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles dgvCreditorInvoiceDetail.DataError
        MessageBox.Show(e.Exception.ToString() & vbCrLf & "RowIndex =" & e.RowIndex & vbCrLf & "ColumnIndex =" & e.ColumnIndex)
 
        Dim ErrContext As DataGridViewDataErrorContexts = e.Context
 
        Dim TEST = dgvCreditorInvoiceDetail.Item(e.RowIndex, e.ColumnIndex).Value
 
        Console.WriteLine(TEST)
 
 
        'Set  a breakpoint here to check what context is causing the error. It might give you further clues
    End Sub
 
 
 
Private Sub dgvCreditorInvoiceDetail_CellValidating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dgvCreditorInvoiceDetail.CellValidating
 
        Try
 
            Dim cell As DataGridViewCell = dgvCreditorInvoiceDetail.Item(e.ColumnIndex, e.RowIndex)
 
            If cell.IsInEditMode Then
 
                Dim c As Control = dgvCreditorInvoiceDetail.EditingControl
 
                Select Case dgvCreditorInvoiceDetail.Columns(e.ColumnIndex).Name
 
                    Case "amount"
 
                        c.Text = CleanInputNumber(c.Text)
 
                    Case "account" 'This has or should have a value but doesnt after you change the list.
 
                        If (c.Text <> "") Then
 
                            'This still returns true as its testing the first 5 characters only.
                            Dim accountExists = Presenter.validateAccountNo(Mid(c.Text, 1, 5))
 
 
                            If accountExists = False Then
 
                                Dim noRowSelected As DialogResult = MessageBoxEx.Show("You must enter a valid account in the account column...", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Information)
 
                            End If
 
                        End If
 
                End Select
 
            End If
 
        Catch ex As Exception
 
            manageWindowsViewError("creditorTASK", "frmCreditorInvoicePayment", "dgvCreditorInvoiceDetail_CellValidating", ex)
 
        End Try
 
    End Sub

Open in new window

0
 
LVL 27

Expert Comment

by:Dabas
ID: 23715002
You will have to provide more information:

Maybe it is best if you paste the section in the designer.vb file that refers to your grid
I assume you have set both the DisplayMember and the ValueMember?

Did you set the binding at design time or at run time, etc
Dabas
0
 

Author Comment

by:si2030
ID: 23717177
Hi Dabas

I am ssuming the designer for this form? I have included it below.

I will also include the code I wrote for this form in the next post...

Binding is done at run time... see next post.
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class frmCreditorInvoicePayment
    Inherits DevComponents.DotNetBar.Office2007Form
 
    'Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub
 
    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer
 
    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Dim DataGridViewCellStyle1 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle
        Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmCreditorInvoicePayment))
        Me.dtInvoiceDate = New DevComponents.Editors.DateTimeAdv.DateTimeInput
        Me.txtInvoiceNumber = New DevComponents.DotNetBar.Controls.TextBoxX
        Me.LabelX2 = New DevComponents.DotNetBar.LabelX
        Me.LabelX3 = New DevComponents.DotNetBar.LabelX
        Me.grpInvoiceDetail = New DevComponents.DotNetBar.Controls.GroupPanel
        Me.dgvCreditorInvoiceDetail = New DevComponents.DotNetBar.Controls.DataGridViewX
        Me.ReflectionLabel2 = New DevComponents.DotNetBar.Controls.ReflectionLabel
        Me.LabelX1 = New DevComponents.DotNetBar.LabelX
        Me.txtTotal = New DevComponents.DotNetBar.Controls.TextBoxX
        Me.ReflectionLabel1 = New DevComponents.DotNetBar.Controls.ReflectionLabel
        Me.cbxshadow = New DevComponents.DotNetBar.Controls.ComboBoxEx
        Me.btnPostInvoice = New DevComponents.DotNetBar.ButtonX
        Me.btnPostPayInvoice = New DevComponents.DotNetBar.ButtonX
        Me.btnCancel = New DevComponents.DotNetBar.ButtonX
        CType(Me.dtInvoiceDate, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.grpInvoiceDetail.SuspendLayout()
        CType(Me.dgvCreditorInvoiceDetail, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SuspendLayout()
        '
        'dtInvoiceDate
        '
        '
        '
        '
        Me.dtInvoiceDate.BackgroundStyle.Class = "DateTimeInputBackground"
        Me.dtInvoiceDate.ButtonDropDown.Visible = True
        Me.dtInvoiceDate.InputHorizontalAlignment = DevComponents.Editors.eHorizontalAlignment.Center
        Me.dtInvoiceDate.Location = New System.Drawing.Point(350, 45)
        Me.dtInvoiceDate.MinimumSize = New System.Drawing.Size(0, 23)
        '
        '
        '
        Me.dtInvoiceDate.MonthCalendar.AnnuallyMarkedDates = New Date(-1) {}
        '
        '
        '
        Me.dtInvoiceDate.MonthCalendar.BackgroundStyle.BackColor = System.Drawing.SystemColors.Window
        Me.dtInvoiceDate.MonthCalendar.ClearButtonVisible = True
        '
        '
        '
        Me.dtInvoiceDate.MonthCalendar.CommandsBackgroundStyle.BackColor2SchemePart = DevComponents.DotNetBar.eColorSchemePart.BarBackground2
        Me.dtInvoiceDate.MonthCalendar.CommandsBackgroundStyle.BackColorGradientAngle = 90
        Me.dtInvoiceDate.MonthCalendar.CommandsBackgroundStyle.BackColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.BarBackground
        Me.dtInvoiceDate.MonthCalendar.CommandsBackgroundStyle.BorderTop = DevComponents.DotNetBar.eStyleBorderType.Solid
        Me.dtInvoiceDate.MonthCalendar.CommandsBackgroundStyle.BorderTopColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.BarDockedBorder
        Me.dtInvoiceDate.MonthCalendar.CommandsBackgroundStyle.BorderTopWidth = 1
        Me.dtInvoiceDate.MonthCalendar.DisplayMonth = New Date(2009, 2, 1, 0, 0, 0, 0)
        Me.dtInvoiceDate.MonthCalendar.FirstDayOfWeek = System.DayOfWeek.Monday
        Me.dtInvoiceDate.MonthCalendar.MarkedDates = New Date(-1) {}
        Me.dtInvoiceDate.MonthCalendar.MonthlyMarkedDates = New Date(-1) {}
        '
        '
        '
        Me.dtInvoiceDate.MonthCalendar.NavigationBackgroundStyle.BackColor2SchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBackground2
        Me.dtInvoiceDate.MonthCalendar.NavigationBackgroundStyle.BackColorGradientAngle = 90
        Me.dtInvoiceDate.MonthCalendar.NavigationBackgroundStyle.BackColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBackground
        Me.dtInvoiceDate.MonthCalendar.TodayButtonVisible = True
        Me.dtInvoiceDate.MonthCalendar.WeeklyMarkedDays = New System.DayOfWeek(-1) {}
        Me.dtInvoiceDate.Name = "dtInvoiceDate"
        Me.dtInvoiceDate.Size = New System.Drawing.Size(84, 23)
        Me.dtInvoiceDate.TabIndex = 1
        '
        'txtInvoiceNumber
        '
        '
        '
        '
        Me.txtInvoiceNumber.Border.Class = "TextBoxBorder"
        Me.txtInvoiceNumber.Location = New System.Drawing.Point(350, 74)
        Me.txtInvoiceNumber.Name = "txtInvoiceNumber"
        Me.txtInvoiceNumber.Size = New System.Drawing.Size(100, 20)
        Me.txtInvoiceNumber.TabIndex = 2
        '
        'LabelX2
        '
        Me.LabelX2.BackColor = System.Drawing.Color.Transparent
        Me.LabelX2.Location = New System.Drawing.Point(255, 71)
        Me.LabelX2.Name = "LabelX2"
        Me.LabelX2.Size = New System.Drawing.Size(90, 23)
        Me.LabelX2.TabIndex = 4
        Me.LabelX2.Text = "Invoice Number: "
        Me.LabelX2.TextAlignment = System.Drawing.StringAlignment.Far
        '
        'LabelX3
        '
        Me.LabelX3.BackColor = System.Drawing.Color.Transparent
        Me.LabelX3.Location = New System.Drawing.Point(270, 45)
        Me.LabelX3.Name = "LabelX3"
        Me.LabelX3.Size = New System.Drawing.Size(75, 23)
        Me.LabelX3.TabIndex = 3
        Me.LabelX3.Text = "Invoice Date: "
        Me.LabelX3.TextAlignment = System.Drawing.StringAlignment.Far
        '
        'grpInvoiceDetail
        '
        Me.grpInvoiceDetail.CanvasColor = System.Drawing.SystemColors.Control
        Me.grpInvoiceDetail.ColorSchemeStyle = DevComponents.DotNetBar.eDotNetBarStyle.Office2007
        Me.grpInvoiceDetail.Controls.Add(Me.dgvCreditorInvoiceDetail)
        Me.grpInvoiceDetail.Controls.Add(Me.ReflectionLabel2)
        Me.grpInvoiceDetail.Controls.Add(Me.LabelX1)
        Me.grpInvoiceDetail.Controls.Add(Me.txtTotal)
        Me.grpInvoiceDetail.Controls.Add(Me.ReflectionLabel1)
        Me.grpInvoiceDetail.Controls.Add(Me.cbxshadow)
        Me.grpInvoiceDetail.Controls.Add(Me.txtInvoiceNumber)
        Me.grpInvoiceDetail.Controls.Add(Me.LabelX3)
        Me.grpInvoiceDetail.Controls.Add(Me.LabelX2)
        Me.grpInvoiceDetail.Controls.Add(Me.dtInvoiceDate)
        Me.grpInvoiceDetail.IsShadowEnabled = True
        Me.grpInvoiceDetail.Location = New System.Drawing.Point(12, 12)
        Me.grpInvoiceDetail.Name = "grpInvoiceDetail"
        Me.grpInvoiceDetail.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.grpInvoiceDetail.Size = New System.Drawing.Size(1017, 265)
        '
        '
        '
        Me.grpInvoiceDetail.Style.BackColor2SchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBackground2
        Me.grpInvoiceDetail.Style.BackColorGradientAngle = 90
        Me.grpInvoiceDetail.Style.BackColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBackground
        Me.grpInvoiceDetail.Style.BorderBottom = DevComponents.DotNetBar.eStyleBorderType.Solid
        Me.grpInvoiceDetail.Style.BorderBottomWidth = 1
        Me.grpInvoiceDetail.Style.BorderColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBorder
        Me.grpInvoiceDetail.Style.BorderLeft = DevComponents.DotNetBar.eStyleBorderType.Solid
        Me.grpInvoiceDetail.Style.BorderLeftWidth = 1
        Me.grpInvoiceDetail.Style.BorderRight = DevComponents.DotNetBar.eStyleBorderType.Solid
        Me.grpInvoiceDetail.Style.BorderRightWidth = 1
        Me.grpInvoiceDetail.Style.BorderTop = DevComponents.DotNetBar.eStyleBorderType.Solid
        Me.grpInvoiceDetail.Style.BorderTopWidth = 1
        Me.grpInvoiceDetail.Style.CornerDiameter = 4
        Me.grpInvoiceDetail.Style.CornerType = DevComponents.DotNetBar.eCornerType.Rounded
        Me.grpInvoiceDetail.Style.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center
        Me.grpInvoiceDetail.Style.TextColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelText
        Me.grpInvoiceDetail.Style.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Near
        Me.grpInvoiceDetail.TabIndex = 0
        Me.grpInvoiceDetail.Text = "Creditors Invoice Details"
        '
        'dgvCreditorInvoiceDetail
        '
        Me.dgvCreditorInvoiceDetail.BackgroundColor = System.Drawing.Color.White
        Me.dgvCreditorInvoiceDetail.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
        DataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft
        DataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window
        DataGridViewCellStyle1.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        DataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.ControlText
        DataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight
        DataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.ControlText
        DataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.[False]
        Me.dgvCreditorInvoiceDetail.DefaultCellStyle = DataGridViewCellStyle1
        Me.dgvCreditorInvoiceDetail.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter
        Me.dgvCreditorInvoiceDetail.GridColor = System.Drawing.Color.FromArgb(CType(CType(208, Byte), Integer), CType(CType(215, Byte), Integer), CType(CType(229, Byte), Integer))
        Me.dgvCreditorInvoiceDetail.HighlightSelectedColumnHeaders = False
        Me.dgvCreditorInvoiceDetail.Location = New System.Drawing.Point(4, 110)
        Me.dgvCreditorInvoiceDetail.Name = "dgvCreditorInvoiceDetail"
        Me.dgvCreditorInvoiceDetail.Size = New System.Drawing.Size(1000, 91)
        Me.dgvCreditorInvoiceDetail.TabIndex = 10
        Me.dgvCreditorInvoiceDetail.VirtualMode = True
        '
        'ReflectionLabel2
        '
        Me.ReflectionLabel2.BackColor = System.Drawing.Color.Transparent
        Me.ReflectionLabel2.Location = New System.Drawing.Point(616, 45)
        Me.ReflectionLabel2.Name = "ReflectionLabel2"
        Me.ReflectionLabel2.Size = New System.Drawing.Size(376, 51)
        Me.ReflectionLabel2.TabIndex = 9
        Me.ReflectionLabel2.Text = "<i><b><font size=""+1"">NOTE: <font color=""#B02B2C"">If this cost relates to one of " & _
            "your assets, then use the dropdown under ""Select Asset"" to apply this invoice to" & _
            " that asset...</font></font></b></i>"
        '
        'LabelX1
        '
        Me.LabelX1.BackColor = System.Drawing.Color.Transparent
        Me.LabelX1.Location = New System.Drawing.Point(827, 210)
        Me.LabelX1.Name = "LabelX1"
        Me.LabelX1.Size = New System.Drawing.Size(71, 23)
        Me.LabelX1.TabIndex = 8
        Me.LabelX1.Text = "<u>Invoice Total:</u>"
        Me.LabelX1.TextAlignment = System.Drawing.StringAlignment.Far
        '
        'txtTotal
        '
        '
        '
        '
        Me.txtTotal.Border.Class = "TextBoxBorder"
        Me.txtTotal.Location = New System.Drawing.Point(904, 210)
        Me.txtTotal.Name = "txtTotal"
        Me.txtTotal.Size = New System.Drawing.Size(100, 20)
        Me.txtTotal.TabIndex = 7
        '
        'ReflectionLabel1
        '
        Me.ReflectionLabel1.BackColor = System.Drawing.Color.Transparent
        Me.ReflectionLabel1.Location = New System.Drawing.Point(3, -7)
        Me.ReflectionLabel1.Name = "ReflectionLabel1"
        Me.ReflectionLabel1.Size = New System.Drawing.Size(240, 45)
        Me.ReflectionLabel1.TabIndex = 6
        Me.ReflectionLabel1.Text = "<b><font size=""+6""><i>CREATE: <font color=""#B02B2C"">Creditors " & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Invoice</font></i" & _
            "></font></b>"
        '
        'cbxshadow
        '
        Me.cbxshadow.DisplayMember = "Text"
        Me.cbxshadow.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed
        Me.cbxshadow.FormattingEnabled = True
        Me.cbxshadow.ItemHeight = 14
        Me.cbxshadow.Location = New System.Drawing.Point(350, 18)
        Me.cbxshadow.Name = "cbxshadow"
        Me.cbxshadow.Size = New System.Drawing.Size(250, 20)
        Me.cbxshadow.TabIndex = 5
        '
        'btnPostInvoice
        '
        Me.btnPostInvoice.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton
        Me.btnPostInvoice.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground
        Me.btnPostInvoice.Location = New System.Drawing.Point(306, 295)
        Me.btnPostInvoice.Name = "btnPostInvoice"
        Me.btnPostInvoice.Size = New System.Drawing.Size(120, 23)
        Me.btnPostInvoice.TabIndex = 2
        Me.btnPostInvoice.Text = "Post Invoice"
        '
        'btnPostPayInvoice
        '
        Me.btnPostPayInvoice.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton
        Me.btnPostPayInvoice.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground
        Me.btnPostPayInvoice.Location = New System.Drawing.Point(461, 295)
        Me.btnPostPayInvoice.Name = "btnPostPayInvoice"
        Me.btnPostPayInvoice.Size = New System.Drawing.Size(120, 23)
        Me.btnPostPayInvoice.TabIndex = 3
        Me.btnPostPayInvoice.Text = "Post and PAY Invoice"
        '
        'btnCancel
        '
        Me.btnCancel.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton
        Me.btnCancel.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground
        Me.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel
        Me.btnCancel.Location = New System.Drawing.Point(616, 295)
        Me.btnCancel.Name = "btnCancel"
        Me.btnCancel.Size = New System.Drawing.Size(120, 23)
        Me.btnCancel.TabIndex = 4
        Me.btnCancel.Text = "Cancel"
        '
        'frmCreditorInvoicePayment
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.CancelButton = Me.btnCancel
        Me.ClientSize = New System.Drawing.Size(1043, 335)
        Me.Controls.Add(Me.btnCancel)
        Me.Controls.Add(Me.btnPostPayInvoice)
        Me.Controls.Add(Me.btnPostInvoice)
        Me.Controls.Add(Me.grpInvoiceDetail)
        Me.DoubleBuffered = True
        Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
        Me.Name = "frmCreditorInvoicePayment"
        Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
        Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent
        Me.Text = "Creditors Invoice & Payment"
        CType(Me.dtInvoiceDate, System.ComponentModel.ISupportInitialize).EndInit()
        Me.grpInvoiceDetail.ResumeLayout(False)
        CType(Me.dgvCreditorInvoiceDetail, System.ComponentModel.ISupportInitialize).EndInit()
        Me.ResumeLayout(False)
 
    End Sub
    Friend WithEvents dtInvoiceDate As DevComponents.Editors.DateTimeAdv.DateTimeInput
    Friend WithEvents txtInvoiceNumber As DevComponents.DotNetBar.Controls.TextBoxX
    Friend WithEvents LabelX2 As DevComponents.DotNetBar.LabelX
    Friend WithEvents LabelX3 As DevComponents.DotNetBar.LabelX
    Friend WithEvents grpInvoiceDetail As DevComponents.DotNetBar.Controls.GroupPanel
    Friend WithEvents cbxshadow As DevComponents.DotNetBar.Controls.ComboBoxEx
    Friend WithEvents ReflectionLabel1 As DevComponents.DotNetBar.Controls.ReflectionLabel
    Friend WithEvents btnPostInvoice As DevComponents.DotNetBar.ButtonX
    Friend WithEvents btnPostPayInvoice As DevComponents.DotNetBar.ButtonX
    Friend WithEvents btnCancel As DevComponents.DotNetBar.ButtonX
    Friend WithEvents LabelX1 As DevComponents.DotNetBar.LabelX
    Friend WithEvents txtTotal As DevComponents.DotNetBar.Controls.TextBoxX
    Friend WithEvents ReflectionLabel2 As DevComponents.DotNetBar.Controls.ReflectionLabel
    Friend WithEvents dgvCreditorInvoiceDetail As DevComponents.DotNetBar.Controls.DataGridViewX
End Class

Open in new window

0
 

Author Comment

by:si2030
ID: 23717190
Below is the code for this form.

Incedently the data is obtained from a LINQ statement in another class. I shall add that in a third post below.
Imports DevComponents.DotNetBar
 
 
Public Class frmCreditorInvoicePayment
 
 
#Region "VARIABLES"
 
    Private Presenter As New frmCreditorInvoicePaymentPRESENTER
 
    Private accountComboBox As New DataGridViewComboBoxColumn
    Private assetComboBox As New DataGridViewComboBoxColumn
 
 
    Dim scAutoComplete As New AutoCompleteStringCollection
 
    Private accountList As Object = Nothing
    Private accComboBoxDropDwnWidth As Integer = 0
 
    Private refTypeList As List(Of String) = Nothing
    Private assetComboBoxDropDwnWidth As Integer = 0
 
    Dim thisUserControl As New uscClientSelect()
 
#End Region
 
#Region "CONSTRUCTOR"
 
    Public Sub New()
 
 
        ' This call is required by the Windows Form Designer.
        InitializeComponent()
 
        ' Add any initialization after the InitializeComponent() call.
        TryCast(Presenter, IPresenter).BindToView(Me)
 
        Me.grpInvoiceDetail.Controls.Add(thisUserControl)
        thisUserControl.Location = New Point(260, 16)
        thisUserControl.TabIndex = 0
        cbxshadow.SendToBack()
        thisUserControl.cbxClientList.Focus()
 
        Me.KeyPreview = True
 
        txtTotal.ReadOnly = True
        txtTotal.TextAlign = HorizontalAlignment.Right
        txtTotal.Text = "$0.00"
 
    End Sub
 
 
#End Region
 
#Region "FORM HANDLERS"
 
    
 
    Private Sub DdgvCreditorInvoiceDetailataGridView1_DataError(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles dgvCreditorInvoiceDetail.DataError
        MessageBox.Show(e.Exception.ToString() & vbCrLf & "RowIndex =" & e.RowIndex & vbCrLf & "ColumnIndex =" & e.ColumnIndex)
 
        Dim ErrContext As DataGridViewDataErrorContexts = e.Context
 
        Dim TEST = dgvCreditorInvoiceDetail.Item(e.RowIndex, e.ColumnIndex).Value
 
        Console.WriteLine(TEST)
 
 
        'Set  a breakpoint here to check what context is causing the error. It might give you further clues
    End Sub
 
    Private Sub frmCreditorInvoicePayment_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        initaliseDGV()
 
        'AddHandler thisUserControl.cbxClientList.Leave, AddressOf testhandler
 
    End Sub
 
   
 
 
    Private Sub dgvCreditorInvoiceDetail_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvCreditorInvoiceDetail.EditingControlShowing
 
        If dgvCreditorInvoiceDetail.CurrentCellAddress.X = accountComboBox.DisplayIndex Then
 
            Dim cmb As ComboBox = CType(e.Control, ComboBox)
 
            'AddHandler cmb.a, AddressOf cmbSelectedIndexChanged
 
            cmb.AutoCompleteMode = AutoCompleteMode.SuggestAppend
            cmb.AutoCompleteSource = AutoCompleteSource.ListItems
 
            'This clears the cell when you first click on it.....
            'dgvCreditorInvoiceDetail.Item(dgvCreditorInvoiceDetail.CurrentCellAddress.X, dgvCreditorInvoiceDetail.CurrentCellAddress.Y).Value = ""
 
            If Not cmb Is Nothing Then
 
                cmb.DropDownStyle = ComboBoxStyle.DropDown
 
                cmb.SelectedIndex = -1
 
            End If
 
        End If
 
    End Sub
 
 
    Private Sub dgvCreditorInvoiceDetail_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dgvCreditorInvoiceDetail.CellFormatting
 
        If Me.dgvCreditorInvoiceDetail.Columns(e.ColumnIndex).Name = "amount" Then
 
            If e.Value = "" Or IsNothing(e.Value) Then
 
                e.Value = "$0.00"
                e.CellStyle.ForeColor = Color.Black
 
            Else
 
                If (e.Value = 0) Then
 
                    e.Value = "$0.00"
                    e.CellStyle.ForeColor = Color.Black
 
                Else
 
                    e.Value = "$" & FormatNumber((e.Value), 2, TriState.UseDefault, TriState.UseDefault, TriState.UseDefault)
 
                    If e.Value > 0 Then
 
                        e.CellStyle.ForeColor = Color.Black
 
                    Else
 
                        e.CellStyle.ForeColor = Color.Red
 
                    End If
 
                    Dim total As Decimal = 0
 
                    For count = 0 To dgvCreditorInvoiceDetail.Rows.Count - 1
 
                        total = total + CType(Mid(dgvCreditorInvoiceDetail.Rows(count).Cells("amount").Value, 1), Decimal)
 
                    Next
 
 
                    txtTotal.Text = String.Format("{0:C}", total)
 
                    If total < 0 Then
 
                        txtTotal.ForeColor = Color.Red
 
                    End If
 
 
                End If
 
            End If
 
        End If
 
        If Me.dgvCreditorInvoiceDetail.Columns(e.ColumnIndex).Name = "ref" Then
 
            If Presenter.validateAssetNo(e.Value) = True Then
 
            Else
 
                e.Value = txtInvoiceNumber.Text
 
            End If
 
        End If
 
        If Me.dgvCreditorInvoiceDetail.Columns(e.ColumnIndex).Name = "detail" Then
 
            If e.Value <> "" Or (e.Value <> Nothing) Then
 
                e.Value = e.Value.ToString.ToUpper
 
            End If
 
        End If
 
    End Sub
 
    Public Sub testhandler()
 
    End Sub
 
    Private Sub dgvCreditorInvoiceDetail_CellValidating1(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dgvCreditorInvoiceDetail.CellValidating
 
        Try
 
            Dim cell As DataGridViewCell = dgvCreditorInvoiceDetail.Item(e.ColumnIndex, e.RowIndex)
 
            If cell.IsInEditMode Then
 
                Dim c As Control = dgvCreditorInvoiceDetail.EditingControl
                'Dim test = (dgvCreditorInvoiceDetail.Columns(e.ColumnIndex).Name)
 
                Select Case dgvCreditorInvoiceDetail.Columns(e.ColumnIndex).Name
 
                    Case "amount", "client"
 
                        c.Text = CleanInputNumber(c.Text)
 
                    Case "detail"
 
                        'c.Text = CleanInputAlphabet(c.Text)
 
                        'cmbSelectedIndexChanged()
                        'cmbSelectedIndexChanged()
 
                    Case "account"
 
                        If (c.Text <> "") Then
 
 
                            'Dim comboBoxColumn As DataGridViewComboBoxColumn = dgvCreditorInvoiceDetail.Columns("account")
 
                            'If (e.ColumnIndex = comboBoxColumn.DisplayIndex) Then
                            '    Dim test = comboBoxColumn.Items.Count
 
                            '    For count = 0 To test
 
                            '        If String.Compare(comboBoxColumn.Items(e.ColumnIndex).acc_id, comboBoxColumn.Items(count).acc_id) Then
 
                            '            Return
 
                            '        End If
 
                            '        Dim noRowSelected As DialogResult = MessageBoxEx.Show("You must enter a valid account in the account column...", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Information)
 
 
                            '    Next
                            '    Dim test6 = comboBoxColumn.Items(e.ColumnIndex).acc_id
 
                            'If (Not comboBoxColumn.Items.Contains(e.FormattedValue)) Then
                            'Dim intIdx = comboBoxColumn.FindString(e.FormattedValue)
                            '    Dim noRowSelected As DialogResult = MessageBoxEx.Show("You must enter a valid account in the account column...", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Information)
 
                            'End If
                            'End If
 
 
 
                            'Dim test3 = dgvCreditorInvoiceDetail.Rows(e.ColumnIndex).Cells(e.RowIndex).Value
 
                            'Dim test1 = dgvCreditorInvoiceDetail.Item(e.ColumnIndex, e.RowIndex).Value
 
 
                            Dim accountExists = Presenter.validateAccountNo(Mid(c.Text, 1, 5))
 
                            If accountExists = False Then
 
                                Dim noRowSelected As DialogResult = MessageBoxEx.Show("You must enter a valid account in the account column...", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Information)
 
                            End If
 
                        End If
 
                End Select
 
            End If
 
        Catch ex As Exception
 
            manageWindowsViewError("creditorTASK", "frmCreditorInvoicePayment", "dgvCreditorInvoiceDetail_CellValidating", ex)
 
        End Try
 
    End Sub
 
    Private Function CleanInputNumber(ByVal str As String) As String
 
        Return System.Text.RegularExpressions.Regex.Replace(str, "[a-zA-Z\b\s]", "")
 
    End Function
 
    Private Function CleanInputAlphabet(ByVal str As String) As String
 
        Return System.Text.RegularExpressions.Regex.Replace(str, "[0-9\b]", "")
 
    End Function
 
 
    'Sub cmbSelectedIndexChanged()
 
    '    Application.DoEvents()
 
    '    SendKeys.Send("{TAB}")
 
    'End Sub
 
#End Region
 
    'INTERFACE IMPLEMENTATION STARTS HERE.
    '*************************************
 
#Region "loaddataGridViewCombbox"
 
    Public Sub initaliseDGV()
 
        Presenter.loadAccountDataGridViewCombbox()
        Presenter.loadTypeDataGridViewCombbox()
 
        'Configure the DGV.
        dgvCreditorInvoiceDetail.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
        dgvCreditorInvoiceDetail.AllowUserToResizeColumns = False
        dgvCreditorInvoiceDetail.AllowUserToDeleteRows = True
        dgvCreditorInvoiceDetail.AllowUserToResizeRows = False
 
        'Create the DGVComboBoxes.
        Dim imgSelectAsset As New DataGridViewImageColumn
 
        'Create the binding sources.
        Dim BSAccountComboBox As New BindingSource
        Dim BSassetComboBox As New BindingSource
 
        'Apply the binding sources.
        BSAccountComboBox.DataSource = accountList
        BSassetComboBox.DataSource = refTypeList
 
        With accountComboBox
 
            .Name = "account"
            .DataSource = BSAccountComboBox
            .HeaderText = "Account"
            .DisplayMember = "accList"
            .ValueMember = "accID"
            .DropDownWidth = accComboBoxDropDwnWidth
            .DefaultCellStyle.BackColor = Color.WhiteSmoke
            .Width = 220
            .FlatStyle = FlatStyle.Flat
            .MaxDropDownItems = 10
 
        End With
 
        With assetComboBox
 
            .Name = "assetNo"
            .DataSource = BSassetComboBox
            .HeaderText = "Select Asset"
            .DropDownWidth = assetComboBoxDropDwnWidth
            .DefaultCellStyle.BackColor = Color.WhiteSmoke
            .Width = 200
            .FlatStyle = FlatStyle.Flat
            .MaxDropDownItems = 2
 
        End With
 
        'With imgSelectAsset
 
        '    .Name = "assetSearch"
        '    .HeaderText = "Select Asset"
        '    .DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter
        '    .DefaultCellStyle.BackColor = Color.WhiteSmoke
        '    .Image = My.Resources.Search16
        '    .CellTemplate = New RefSearchImageCell
 
        'End With
 
        With dgvCreditorInvoiceDetail
 
            'Add the accountComboBox column to the DataGridView control.
            .Columns.Add(accountComboBox)
 
            'Add the Detail column.
            .Columns.Add("detail", "Detail")
            .Columns("detail").AutoSizeMode = DataGridViewAutoSizeColumnsMode.Fill
 
            ''Add the reference button column.
            '.Columns.Add(imgSelectAsset)
            '.Columns("refSearch").Width = 70
 
 
            'Add the assetComboBox column to the DataGridView control.
            .Columns.Add(assetComboBox)
 
            'Add the Reference column.
            .Columns.Add("ref", "Inv./Asset-Ref")
            .Columns("ref").Width = 80
            .Columns("ref").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            ''Add the Client column.
            '.Columns.Add("client", " Cl. No.")
            '.Columns("client").Width = 70
            '.Columns("client").DefaultCellStyle.BackColor = Color.WhiteSmoke
 
            'Add the Amount column.
            .Columns.Add("amount", "Amount - $")
            .Columns("amount").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("amount").Width = 100
            Console.WriteLine(Format(123, "c"))
        End With
 
    End Sub
 
    Public Sub applyAccountList(ByVal accList As Object)
 
        Try
 
            accountList = accList
 
            'Create a GDI+ drawing surface to measure string widths
            Dim ds As System.Drawing.Graphics = CreateGraphics()
 
            accComboBoxDropDwnWidth = 0
 
            For Each accLst In accountList
 
                accComboBoxDropDwnWidth = Math.Max(accComboBoxDropDwnWidth, ds.MeasureString(accLst.accList, Font).Width)
 
            Next
 
            'Clean up the drawing surface
            ds.Dispose()
 
        Catch ex As Exception
 
            manageWindowsViewError("creditorTASK", "frmCreditorInvoicePayment", "applyAccountList", ex)
 
        End Try
 
    End Sub
 
    Public Sub applyRefTypeList(ByVal typeList As List(Of String))
 
        Try
 
            refTypeList = typeList
 
            'Create a GDI+ drawing surface to measure string widths
            Dim ds As System.Drawing.Graphics = CreateGraphics()
 
            assetComboBoxDropDwnWidth = 0
 
            For Each typeLst In refTypeList
 
                assetComboBoxDropDwnWidth = Math.Max(assetComboBoxDropDwnWidth, ds.MeasureString(Trim(typeLst), Font).Width)
 
            Next
 
            'Clean up the drawing surface
            ds.Dispose()
 
        Catch ex As Exception
 
            manageWindowsViewError("creditorTASK", "frmCreditorInvoicePayment", "applyAccountList", ex)
 
        End Try
 
    End Sub
 
 
    Public Sub addNewRow()
        Try
 
        Catch ex As Exception
 
            manageWindowsViewError("creditorTASK", "frmCreditorInvoicePayment", "addNewRow", ex)
 
        End Try
 
    End Sub
 
 
    Public Sub validateInvoice()
 
        Try
 
            Dim errorUscClientName As Boolean = False
            Dim errorInvDate As Boolean = False
            Dim errorInvNo As Boolean = False
            Dim dgvErrorTest As Boolean = False
 
            'Dim assignedTo As String = TryCast(dgvCreditorInvoiceDetail.Rows(0).Cells("account").Value, acc_id)
 
            ' Dim t = dgvCreditorInvoiceDetail.Item(0, 0).accountComboBox.SelectedValue
 
            Dim test = dgvCreditorInvoiceDetail.Rows
 
 
            ''Validate "client name and existance"
            errorUscClientName = errorDisplay_Existance(thisUserControl.cbxClientList, "You must CHOOSE a CLIENT for this form to be saved...")
 
            errorUscClientName = errorDisplay_Value(thisUserControl.cbxClientList, _
                                                                                  Presenter.validateClientName(Mid(thisUserControl.cbxClientList.Text, 1, 4)) _
                                                                                  , "You must CHOOSE a CLIENT from the dropdown list...")
 
 
            errorInvDate = errorDisplay_Existance(dtInvoiceDate, "You must fill in the date inorder to POST this invoice...")
 
            If dtInvoiceDate.Text <> "" Then
 
                If (CDate(dtInvoiceDate.Text)) > (CDate(DateTime.Today)) Then
 
                    errorInvDate = True
 
                Else
 
                    errorInvDate = False
 
                End If
 
            End If
 
 
            errorInvNo = errorDisplay_Existance(txtInvoiceNumber, "You must enter an INVOICE number to POST this invoice...")
 
 
            For count = 0 To dgvCreditorInvoiceDetail.Rows.Count
 
                Dim test5 = dgvCreditorInvoiceDetail.Rows(count).Cells(0).Value
                Dim test1 = dgvCreditorInvoiceDetail.Rows(1).Cells(0).Value
                Dim test2 = dgvCreditorInvoiceDetail.Rows(1).Cells(1).Value
 
            Next
 
 
 
 
 
 
        Catch ex As Exception
 
            manageWindowsViewError("creditorTASK", "frmCreditorInvoicePayment", "validateInvoice", ex)
 
        End Try
    End Sub
 
 
    'Any entry into the text search field must be uppercase. This converts it.
    Public Sub convertToUpperCase(ByRef e As System.Windows.Forms.KeyPressEventArgs)
 
        Try
 
            If Char.IsLetter(e.KeyChar) Then
 
                e.KeyChar = Char.ToUpper(e.KeyChar)
 
            End If
 
        Catch ex As Exception
 
            manageWindowsViewError("accountTASK", "frmAccountDisplay", "convertToUpperCase", ex)
 
        End Try
 
    End Sub
 
 
 
    Private Sub dgvCreditorInvoiceDetail_CellValidating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dgvCreditorInvoiceDetail.CellValidating
 
        Try
 
            Dim cell As DataGridViewCell = dgvCreditorInvoiceDetail.Item(e.ColumnIndex, e.RowIndex)
 
            If cell.IsInEditMode Then
 
                Dim c As Control = dgvCreditorInvoiceDetail.EditingControl
 
                Select Case dgvCreditorInvoiceDetail.Columns(e.ColumnIndex).Name
 
                    Case "amount"
 
                        c.Text = CleanInputNumber(c.Text)
 
                    Case "account" 'This has or should have a value but doesnt after you change the list.
 
                        If (c.Text <> "") Then
 
                            'This still returns true as its testing the first 5 characters only.
                            Dim accountExists = Presenter.validateAccountNo(Mid(c.Text, 1, 5))
 
 
                            If accountExists = False Then
 
                                Dim noRowSelected As DialogResult = MessageBoxEx.Show("You must enter a valid account in the account column...", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Information)
 
                            End If
 
                        End If
 
                End Select
 
            End If
 
        Catch ex As Exception
 
            manageWindowsViewError("creditorTASK", "frmCreditorInvoicePayment", "dgvCreditorInvoiceDetail_CellValidating", ex)
 
        End Try
 
    End Sub
 
 
 
 
#End Region
 
 
 
End Class

Open in new window

0
 

Author Comment

by:si2030
ID: 23717207
This is the sub that supplies the account details. It contains two columns the first being the value member.

It then calls the sub in the class above via applyAccountList and copies over the data. The LINQ statment does work as I have checked the contents via debug...

Hope this all helps.

Simon.
  Public Sub loadAccountDataGridViewCombbox()
 
            Try
               
                Dim accountList = From account In db.accounts _
                                                      Select accID = CType(account.acc_id, String), _
                                                      accList = account.print_pos & "    " & account.acc_name
 
                
                View.applyAccountList(accountList)
 
            Catch ex As Exception
 
                managePresenterError("creditorTASK", "frmCreditorInvoicePaymentPRESENTER", "getAccountTypes", ex)
 
            End Try
 
        End Sub

Open in new window

0
 
LVL 27

Expert Comment

by:Dabas
ID: 23717233
Simon:

This is getting complicated and beyond your original question.

It would be fair to say that the original question as asked has been answered.

I suggest you create a related question to give other experts a chance to contribute with their input as well.
Although I am Link literate, there will be others with more experience than what I can help you with

Dabas
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

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

Article by: Kraeven
Introduction Remote Share is a simple remote sharing tool, enabling you to see, add and remove remote or local shares. The application is written in VB.NET targeting the .NET framework 2.0. The source code and the compiled programs have been in…
It’s quite interesting for me as I worked with Excel using vb.net for some time. Here are some topics which I know want to share with others whom this might help. First of all if you are working with Excel then you need to Download the Following …
We’ve all felt that sense of false security before—locking down external access to a database or component and feeling like we’ve done all we need to do to secure company data. But that feeling is fleeting. Attacks these days can happen in many w…
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…
Suggested Courses

829 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