1

gridDetailsdiscountを含むデータグリッドがありtotal、データベースから入力されています

Totalは読み取り専用ですが、discountそうではありません。割引額が変更されると、合計は次のように再計算されます。

gridDetails.Item(1, e.RowIndex).Value -= (Val(gridDetails.Item(2, e.RowIndex).Value))

値を変更した後、列を並べ替えることができません。それは例外を生成します

System.ArgumentException was unhandled
  Message="Object must be of type Double."
  Source="mscorlib"
  StackTrace:
       at System.Double.CompareTo(Object value)
       at System.Collections.Comparer.Compare(Object a, Object b)
       at System.Windows.Forms.DataGridViewRowCollection.RowComparer.CompareObjects(Object value1, Object value2, Int32 rowIndex1, Int32 rowIndex2)
       at System.Windows.Forms.DataGridViewRowCollection.RowArrayList.Pivot(Int32 left, Int32 center, Int32 right)
       at System.Windows.Forms.DataGridViewRowCollection.RowArrayList.CustomQuickSort(Int32 left, Int32 right)
       at System.Windows.Forms.DataGridViewRowCollection.RowArrayList.CustomSort(RowComparer rowComparer)
       at System.Windows.Forms.DataGridViewRowCollection.Sort(IComparer customComparer, Boolean ascending)
       at System.Windows.Forms.DataGridView.SortInternal(IComparer comparer, DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
       at System.Windows.Forms.DataGridView.Sort(DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
       at System.Windows.Forms.DataGridView.OnColumnHeaderMouseClick(DataGridViewCellMouseEventArgs e)
       at System.Windows.Forms.DataGridView.OnMouseClick(MouseEventArgs e)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.DataGridView.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(ApplicationContext context)
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       at cableguy.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException:

Cdbl、DirectCast などを使用して結果を double に変換しました。 gridDetails.Item(1, e.RowIndex).Value = Cdbl(gridDetails.Item(1, e.RowIndex).Value-Val(gridDetails.Item(2, e.RowIndex).Value))

何か案が??

4

4 に答える 4

2

そうです、これが私が考えていることです。データベースからデータをロードすると、テーブルに文字列として表示されます。このようにソート可能で、すべて問題ありません。次に、減算で値を変更します (おそらく最初の行)。これにより、代わりに double に基づくソートが変更されます。テーブル全体が文字列で表示されるため、クラッシュします。

したがって、基本的には、最初から Datagridview に double を挿入するか、テーブルをロードした後に列のすべての値を変換するか、更新された値を文字列として挿入することを確認してください。

于 2012-10-26T06:49:25.133 に答える
2

double、decimal などをグリッドビューに追加していて、値のない場所にゼロを追加する必要がある場合は、必ず Ctype を使用してください。

If IsNumeric(drs.Item("qty")) then
   dgvX.row(I).cell(0).value = CType(drs.Item("qty"), decimal)
Else
   dgvX.row(I).cell(0).value = CType(0, decimal)
End If
于 2016-09-20T18:06:25.577 に答える
0

@WozzeCが説明した理由は...それを大丈夫にするために行ったことを追加しています..グリッドに追加する前に、値をDoubleに変換しました。今はおけい.. :) :happy:

データをデータリーダーに読み取り、

 While data.Read = True
  Dim total_amount As Double = data("discount")
  Dim discount_amount As Double = data("total")
  gridDetails.Rows.Add(total_amount ,discount_amount)
 End While
于 2012-10-26T07:16:55.817 に答える