1. 程式人生 > >DataGridView繫結list物件,出現索引 0 沒有值

DataGridView繫結list物件,出現索引 0 沒有值

已成功測試,用bindinglist而且不用重新繫結,好用!

在我做專案的時候,datagridview繫結物件列表後,再點選datagridview控制元件,就會報一個"索引 -1 沒有值。"的錯誤資訊,跟蹤錯誤資訊,發現是在System.Windows.Forms.CurrencyManager.get_Item(Int32 index)裡出的錯,在網上搜了一下,找到了以下文章。最後,我的解決辦法是,在繫結資料之前,檢查物件列表是否為0,如果是,則添一個空物件到物件列表,問題解決。

 

我是這樣繫結DataGridVeiw的:

DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格IList<

Resource> resources = new List<Resource>();
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格Resource  resource 
= new Resource();
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格resources.Add(resource);
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格dataGridView.DataSource 
= resources;

    
        在第一個模組中能正常使用,沒有任何問題。但到了第二個模組,同樣的語句,只要一點選DataGridView控制元件,馬上就會跳出System.IndexOutOfRangeException異常,具體內容如下:

DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格未處理 System.IndexOutOfRangeException
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格  Message
="索引 -1 沒有值。"
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格  Source="System.Windows.Forms"
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格  StackTrace:
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.CurrencyManager.get_Current()
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格

       在 System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnRowEnter(DataGridViewCellEventArgs e)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.DataGridView.OnCellMouseDown(HitTestInfo hti, Boolean isShiftDown, Boolean isControlDown)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.DataGridView.OnCellMouseDown(DataGridViewCellMouseEventArgs e)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.DataGridView.OnMouseDown(MouseEventArgs e)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.Control.WmMouseDown(Message
& m, MouseButtons button, Int32 clicks)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.Control.WndProc(Message
& m)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.DataGridView.WndProc(Message
& m)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message
& m)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message
& m)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG
& msg)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Windows.Forms.Application.Run(Form mainForm)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 KoalaStudio.ksRBAC.PrivilegeConfigTool.Program.Main()
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格       在 System.Threading.ThreadHelper.ThreadStart()
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格


        而且比較可惡的是,丟擲異常的地方竟然是在Program.cs裡,指向

DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格Application.Run(new FrmMain());

        這讓人怎麼除錯,試了N回,也沒發現原因。

        於是上網找了找,竟然真有解決的方法,其作者也並未解決這個問題,而是採取了折衷的方法,用了一個過渡元件來解決:

DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格BindingSource bindingSource = new BindingSource();
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格bindingSource.DataSource 
= resources;
DataGridView繫結list物件,出現索引 -1 沒有值。 - kogu - kogu的部落格dgvResource.DataSource 
= bindingSource;


        問題可以解決,但又有了新的問題,因為使用了BindingSource,因此對與DataGridView的更改並不能同步到Ilist<Resource>物件上,所以還是不能用這種方法,繼續研究。

         上國外的網站看了看,終於找到了問題的原因,在向DataGridView繫結Ilist<T>型別的物件是,如果物件的成員為0,那麼就會出現
此問題。而且即使重新繫結DataGridView的資料來源,也會繼續存在此問題,解決的方法就是在向DataGridView繫結Ilist<T>物件是,要保證其中至少有一個成員,否則寧可不繫結(雖然不是最完美的解決方法)。
        其實最好的方法,是用BindingList<T>物件代替Ilist<T>物件作為DataGridView的資料來源,即可徹底解決此問題,而且能實現DataGridView修改時與資料來源的自動更新。但現在沒有時間,只能先這樣用了