2015-01-22 2 views
0

Я импортирую файл excel в DataGridView, и мне нужно получить среднее значение для некоторого столбца. Все работает отлично, когда я пытаюсь использовать образец excel, который составляет около 300 строк. Но когда я пытаюсь использовать фактический файл excel с 41000 строк, я получаю ошибку «указанный приведение недействителен», когда я нажимаю кнопку, чтобы вычислить среднее значение. Я действительно не знаю, что случилось, и не знаю, как его решить. Вот код, который я использую для получения среднего значения, ошибка в столбцах, которые я группирую.указанный литой недействителен на linq

private void Ave_Click(object sender, EventArgs e) 
{ 
    BindingSource bindingSource1 = new BindingSource(); 
    bindingSource1.DataSource = (from r in dt.AsEnumerable() 
           group r by new 
           { 
            RNCID = r.Field<Double?>("RNCID"), 
            Date = r.Field<DateTime>("Date"), 
            WBTSNAME = r.Field<String>("WBTSNAME") 

           } into g 

           select new 
           { 
            g.Key.Date, 
            g.Key.RNCID, 
            g.Key.WBTSNAME, 
            VSLCDLMeanLicenseGroupShare = g.Average(r => r.Field<Double>("VS LC DLMean LicenseGroup Share")), 
            VSLCDLCreditAvailableShared = g.Average(r => r.Field<Double>("VS LC DLCreditAvailable Shared")), 
            VSLCULMeanLicenseGroupShare = g.Average(r => r.Field<Double>("VS LC ULMean LicenseGroup Share")), 
            VSLCULCreditAvailableShared = g.Average(r => r.Field<Double>("VS LC ULCreditAvailable Shared")), 
            UtilDL = g.Average(r => r.Field<Double?>("Util DL")), 
            UtilUL = g.Average(r => r.Field<Double?>("Util UL")), 

           }); 

    dataGridView1.DataSource = bindingSource1; 
} 

вот трассировки стека я получил

System.InvalidCastException was unhandled 

Message = "Указанный бросок не является действительным." Источник = "System.Data.DataSetExtensions" StackTrace: на System.Data.DataRowExtensions.UnboxT 1.NullableField[TElem](Object value) at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) at CE_Fin.Form1.<Ave_Click>b__0(DataRow r) in C:\Users\Administrator\Documents\Visual Studio 2008\Projects\Final\CE_Fin\Form1.cs:line 215 at System.Linq.Lookup 2.Create [TSource] (IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 Comparer) на System.Linq.GroupedEnumerable 3.GetEnumerator() at System.Linq.Enumerable.WhereSelectEnumerableIterator 2. MoveNext() на System.Windows.Forms.BindingSource.GetListFromEnumerable (IEnumerable перечислимы) на System.Windows.Forms.BindingSource.ResetList() в System.Windows.Forms.BindingSource.set_DataSource (значение объекта) на CE_Fin. Form1.Ave_Click (отправитель объекта, EventArgs e) в C: \ Users \ Administrator \ Documents \ Visual Studio 2008 \ Projects \ Final \ CE_Fin \ Form1.cs: строка 21 в System.Windows.Forms.Control.OnClick (Ev entArgs е) в System.Windows.Forms.Button.OnClick (EventArgs е) в System.Windows.Forms.Button.OnMouseUp (MouseEventArgs mevent) на System.Windows.Forms.Control.WmMouseUp (сообщение & м, MouseButtons кнопка, Int32 щелкает) на System.Windows.Forms.Control.WndProc (Сообщение & м) на System.Windows.Forms.ButtonBase.WndProc (Сообщение & м) в System.Windows.Forms.Button.WndProc (Message & м) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & м) на System.Windows.Forms.Control.ControlNativeWindow.WndProc (сообщение & м) на System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr HWND, Int32 MSG, IntPtr WPARAM, IntPtr LPARAM) в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW (MSG & MSG) в System.Windows.Forms.Application. ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (Int32 dwComponentID, Int32 причина, Int32 pvLoopData) на System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (Int32 причине, ApplicationContext контекст) в System.Windows.Forms .Application.ThreadContext.RunMessageLoop (причина Int32, контекст ApplicationContext) в System.Windows.Forms.Application.Run (форма mainForm) в CE_Fin.Program.Main() в C: \ Users \ Administrator \ Documents \ Visual Studio 2008 \ Projects \ Final \ CE_Fin \ Program.cs: строка 18 на System.AppDomain._nExecuteAssembly (сборки Ассамблеи, String [] арг) в System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] арг) на Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() на System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта) в System.Threading.ExecutionContext.Run (ИсполнениеКонтекстовое исполнениеКонтекст, Обратный вызов ContextCallback, Состояние объекта) в System.Threading.ThreadHelper.ThreadStart() InnerException:

+5

Пожалуйста, покажите точное исключение. Вероятно, это один из тех вызовов «Поле», которые терпят неудачу, но мы не можем сказать, без каких-либо дополнительных сведений. –

ответ

0

Вероятной причиной является то, что один из этих полей имеет нулевое значение:

r.Field<Double>("VS LC DLMean LicenseGroup Share") 
r.Field<Double>("VS LC DLCreditAvailable Shared") 
r.Field<Double>("VS LC ULMean LicenseGroup Share") 
r.Field<Double>("VS LC ULCreditAvailable Shared") 

сделать их обнуляемым <double?> (как вы уже делаете для "Util DL" и "Util UL")

+0

Я пробовал это, но все равно получаю то же предупреждение – helix

+0

@helix - тогда, пожалуйста, покажите трассировку стека исключений –

Смежные вопросы