Как разрешить значение не может быть null. Имя параметра: источник в linq?

c#
Вопрос:Я не знаю, почему я получаю такую ​​ошибку. Иногда это происходит, и я подозрительно отношусь к моему коду, который все еще работает с потоком, пока я закрываю приложение. Поэтому, когда я открываю снова, это случается. Value cannot be null. Parameter name: source StackTree : at System.Linq.Enumerable.Where[TSource](IEnumerable`1 source, Func`2 predicate) at Susenas2015.ViewModels.Kuesioner.VMVsen15_KVal.SettingValidationAndRange(List`1 listTextBox, List`1 listCheckBox, TabControl

Вопрос:

Я не знаю, почему я получаю такую ​​ошибку. Иногда это происходит, и я подозрительно отношусь к моему коду, который все еще работает с потоком, пока я закрываю приложение. Поэтому, когда я открываю снова, это случается.

Value cannot be null. Parameter name: source StackTree : at System.Linq.Enumerable.Where[TSource](IEnumerable`1 source, Func`2 predicate) at Susenas2015.ViewModels.Kuesioner.VMVsen15_KVal.SettingValidationAndRange(List`1 listTextBox, List`1 listCheckBox, TabControl tabControl) in d:handitaOfficeProjectSusenas 2015Aplikasi Template SurveiSusenas2015ViewModelsKuesionerVMVsen15_KVal.cs:line 430 at Susenas2015.ViewModels.Kuesioner.VMVsen15_KVal.vSen15_K_Loaded(Object sender, RoutedEventArgs e) in d:handitaOfficeProjectSusenas 2015Aplikasi Template SurveiSusenas2015ViewModelsKuesionerVMVsen15_KVal.cs:line 846 at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e) at System.Windows.BroadcastEventHelper.BroadcastEvent(DependencyObject root, RoutedEvent routedEvent) at System.Windows.BroadcastEventHelper.BroadcastLoadedEvent(Object root) at MS.Internal.LoadedOrUnloadedOperation.DoWork() at System.Windows.Media.MediaContext.FireLoadedPendingCallbacks() at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks() at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget) at System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget) at System.Windows.Media.MediaContext.Resize(ICompositionTarget resizedCompositionTarget) at System.Windows.Interop.HwndTarget.OnResize() at System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr wpa`

Мой код здесь

private void SettingValidationAndRange(List<TextBox> listTextBox, List<CheckBox> listCheckBox, TabControl tabControl) { List<string> listNotDeclare = new List<string>(); foreach (var textB in listTextBox) { if (textB.Tag != null) break; Metadata metadata = ListMetadataKor.Where( x => «text» + x.Field == textB.Name // this line 430 ).FirstOrDefault(); if (metadata == null) { if (!string.IsNullOrEmpty(textB.Name)) listNotDeclare.Add(textB.Name); } else { metadata.TabControl = tabControl; textB.Tag = metadata; } textB.AddEvents(); textB.AutomateFocus(); } if (listNotDeclare.Count > 0) { Clipboard.SetText(string.Join(«,», listNotDeclare.ToArray())); Dialog.Info(«Ada beberapa Metadata tidak ditemukan data sudah dicopy ke clipboard»); } }

Когда я запускаю свое приложение в первый раз, он не получает никаких ошибок. Это происходит, когда я открываю второй или более. И если я открою приложение, оно застряло бы в этом коде.

Как я могу это решить? Я уверен, что мое свойство ListMetadataKor не null

И ListMetadataKor является экземпляром объекта List<Metadata>, который я создал. Это случается только в редких случаях. И я не знаю, чтобы решить это.

UPDATE

Это мой код на картинке enter image description here

Я заполняю ListMetadataKor этим кодом

BWHelper.Run((s, e) => { DataTable dataMetaDataKOR = ExcelHelper.GetDataTableFromExcel( AppConstants.FILE_METADATA, AppConstants.SHEET_METADATA_KOR ); DataTable dataKonsistensiKOR = ExcelHelper.GetDataTableFromExcel( AppConstants.FILE_METADATA, AppConstants.SHEET_KONSISTENSI_KOR ); listKonsistensiKor = Tools.ToolConvert.GetKonsistensi(dataKonsistensiKOR); listMetadataKor = Tools.ToolConvert.GetMetadata(dataMetaDataKOR); foreach (Metadata metadata in listMetadataKor) { metadata.Range.ProsesRange(); } }, (s, e) => { try { kor = new VSEN15_K() { Title = «Validasi Susenas — KOR» }; kor.DataContext = new VMVsen15_KVal(rtSusenas.MasterRT, kor, this, listKonsistensiKor, listMetadataKor); kor.PreviewKeyDown += EventsCollection.EnterAsTabPreviewKeyDown; vmHome.HideLoading(); UpdateMetaDataEntriKOR(RTSusenas.MasterRT); kor.ShowDialog(); } catch (Exception Ex) { vmHome.HideLoading(); Dialog.Error(Ex); } });

И затем я бросаю переменную через конструктор моего класса

public VMVsen15_KVal( MasterRT masterRT, VSEN15_K vSen15_K, IDaftarSusenas vmDaftarRTSusenas, List<Konsistensi> listKonsistensiKor, List<Metadata> listMetadataKor ) { ListArtDetail = new ObservableCollection<ARTDetailVal>(); this.ListKonsistensiKor = listKonsistensiKor; this.ListMetadataKor = listMetadataKor;

Мои инструменты konsistensi как это

public static List<Konsistensi> GetKonsistensi(DataTable dataTable) { List<Konsistensi> listMetadata = new List<Konsistensi>(); for (int i = 0; i < dataTable.Rows.Count; i++) { Konsistensi k = new Konsistensi(); object[] required = new object[] { DBNull.Value, «» }; k.Field = dataTable.Rows[i][FIELD].ToString(); if (string.IsNullOrWhiteSpace(k.Field)) continue; k.Message = dataTable.Rows[i][MESSAGE].ToString(); var obj = dataTable.Rows[i][ORDER]; k.Order = !required.Contains(dataTable.Rows[i][ORDER]) ? Convert.ToInt32(dataTable.Rows[i][ORDER]) : (int?)null; k.Page = !required.Contains(dataTable.Rows[i][PAGE]) ? Convert.ToInt32(dataTable.Rows[i][PAGE]) : (int?)null; k.Perlakuan = dataTable.Rows[i][PERLAKUAN].ToString(); k.RelFields = dataTable.Rows[i][RELFIELDS].ToString(); k.Rule = dataTable.Rows[i][RULE].ToString(); if (dataTable.Rows[i][LEVEL].ToString().ToUpper() == («ART»)) k.LevelKonsistensi = LevelKonsistensi.ART; else if (dataTable.Rows[i][LEVEL].ToString().ToUpper() == («RT»)) k.LevelKonsistensi = LevelKonsistensi.RT; else if (dataTable.Rows[i][LEVEL].ToString().ToUpper() == («RTWARNING»)) k.LevelKonsistensi = LevelKonsistensi.RTWarning; else if (dataTable.Rows[i][LEVEL].ToString().ToUpper().Contains(«ARTWARNING»)) k.LevelKonsistensi = LevelKonsistensi.ARTWarning; else k.LevelKonsistensi = LevelKonsistensi.Lain; //k.LevelKonsistensi = dataTable.Rows[i][LEVEL].ToString().Contains(«ART») ? LevelKonsistensi.ART : LevelKonsistensi.RT; if (k.IsEmpty()) continue; listMetadata.Add(k); } return listMetadata; } Лучший ответ:

В сообщении об ошибке четко указано, что параметр source null. Источник – это перечисляемый вами список. В вашем случае это объект ListMetadataKor. И его определенно null в то время, когда вы его фильтруете второй раз. Убедитесь, что вы никогда не назначали null этому списку. Просто проверьте все ссылки на этот список в коде и найдите назначения.

Ответ №1

  Значение не может быть нулевым. Имя параметра: источник

Выше ошибка возникает в ситуации, когда вы запрашиваете коллекцию, которая является нулевой.

Для демонстрации кода ниже приведено такое исключение.

Console.WriteLine(«Hello World»); IEnumerable<int> list = null; list.Where(d => d ==4).FirstOrDefault();

Вот вывод приведенного выше кода.

Привет, мир Исключение во время выполнения (строка 11): значение не может быть нулевым. Имя параметра: источник

Stack Trace:

[System.ArgumentNullException: значение не может быть нулевым. Имя параметра: источник] в Program.Main(): строка 11

В вашем случае ListMetadataKor является нулевым.
Здесь – скрипка, если вы хотите поиграть.

Ответ №2

Когда вы вызываете оператор Linq следующим образом:

// x = new List<string>(); var count = x.Count(s => s.StartsWith(«x»));

Фактически вы используете метод расширения в пространстве имен System.Linq, поэтому компилятор переводит его в:

var count = Enumerable.Count(x, s => s.StartsWith(«x»));

Итак, ошибка, которую вы получаете выше, состоит в том, что первый параметр source (который был бы x в примере выше) равен null.

Ответ №3

  System.ArgumentNullException: значение не может быть нулевым. Имя параметра: значение

Это сообщение об ошибке не очень полезно!

Вы можете получить эту ошибку разными способами. Ошибка не всегда может быть связана с именем параметра: значение. Это может быть любое имя параметра, передаваемое в функцию.

В качестве общего способа решения этой проблемы рассмотрим трассировку стека или стек вызовов:

Test method GetApiModel threw exception: System.ArgumentNullException: Value cannot be null. Parameter name: value at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)

Вы можете видеть, что имя параметра value является первым параметром для DeserializeObject. Это привело меня к проверке моего сопоставления AutoMapper, где мы десериализовываем строку JSON. Эта строка пуста в моей базе данных.

Вы можете изменить код для проверки на ноль.

Ответ №4

Ниже указана ошибка при экспорте отчетов Crystal в формате Excel.

System.ArgumentNullException: Value cannot be null. Parameter name: window at System.Windows.Interop.WindowInteropHelper..ctor(Window window) at System.Windows.MessageBox.Show(Window owner, String messageBoxText, String caption, MessageBoxButton button, MessageBoxImage icon) at SAPBusinessObjects.WPF.Viewer.ViewerCore.HandleExceptionEvent(Object eventSource, Exception e, Boolean suppressMessage) at SAPBusinessObjects.WPF.Viewer.MainReportDocument.Export(ExportRequestContext context, String filePath) at SAPBusinessObjects.WPF.Viewer.ReportAlbum.<>c__DisplayClass4.<ExportReport>b__3() at SAPBusinessObjects.WPF.Viewer.DelegateMarshaler.<>c__DisplayClass29.<QueueOnThreadPoolThread>b__28(Object ) at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() at System.Threading.ThreadPoolWorkQueue.Dispatch() at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

Оцените статью
Добавить комментарий