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

24

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

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:\handita\Office\Project\Susenas 2015\Aplikasi Template Survei\Susenas2015\ViewModels\Kuesioner\VMVsen15_KVal.cs:line 430
   at Susenas2015.ViewModels.Kuesioner.VMVsen15_KVal.vSen15_K_Loaded(Object sender, RoutedEventArgs e) in d:\handita\Office\Project\Susenas 2015\Aplikasi Template Survei\Susenas2015\ViewModels\Kuesioner\VMVsen15_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

Это мой код на картинке

Я заполняю 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;
}
    
задан mrhands 16.02.2015 в 10:06
источник
  • Проверьте, не является ли x –  Nikolay Kostov 16.02.2015 в 10:09
  • Я уверен, что ListMetadataKor имеет значение null, потому что ошибка говорит о том, что параметр источника имеет значение null. Источник - это перечисляемая вами фильтрация –  Sergey Berezovskiy 16.02.2015 в 10:09
  • @mrhands Проверьте, является ли ListMetadataKor нулевым или нет. –  Suraj Singh 16.02.2015 в 10:10
  • @mrhands Можете ли вы выделить строку №. 430 вашего кода. –  Piyush 16.02.2015 в 10:12
  • Я получаю эту ошибку только в моих приложениях выпуска, установленных на клиенте. Я никогда не получаю эту ошибку в разработке. И в первый раз он всегда успешно работает. но иногда на другом компьютере он не работает. Я все еще путаюсь, потому что я могу получить то, что на самом деле происходит здесь. –  mrhands 16.02.2015 в 10:14
Показать остальные комментарии

3 ответа

23

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

    
ответ дан Sergey Berezovskiy 16.02.2015 в 10:19
  • Я не знаю, как это проверить. потому что он запускается в выпусках приложений. не в моей среде разработки. Поэтому я думаю, что сначала нужно сделать удаленный отладчик, чтобы узнать о реальных проблемах. Но вы думаете, что, возможно, моя переменная все еще находится в памяти со значением null? –  mrhands 16.02.2015 в 10:23
  • @mrhands Я на 100% уверен, что ListMetadataKor имеет значение null. Вам следует начать с метода Tools.ToolConvert.GetMetadata и проверить, когда он возвращает значение null. Я считаю, что он возвращает null, если таблица dataMetaDataKOR пуста. Похоже, вы должны вернуть пустой список в этом случае –  Sergey Berezovskiy 16.02.2015 в 10:27
  • Хорошо .. У вас есть идея, что мой код не загружается в backgroundworker? Я загрузил его с помощью потока BWHelper.Run –  mrhands 16.02.2015 в 10:28
  • @mrhands также возможной проблемой является обработка исключений в вашем методе BWHelper.Run. Что произойдет, если есть исключение при загрузке таблиц данных или использовании методов ToolConvert? Вы назначаете в этом случае переменную listMetadataKor? Или он остается неназначенным с нулевым значением по умолчанию? –  Sergey Berezovskiy 16.02.2015 в 10:32
  • Да, это .. Большое спасибо: D –  mrhands 17.02.2015 в 02:05
Показать остальные комментарии
7
  

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

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

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

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

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

  

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

     

Трассировка стека:

     

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

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

    
ответ дан Jenish Rabadiya 16.02.2015 в 10:25
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.

    
ответ дан samjudson 16.02.2015 в 10:19
  • Как я могу это решить? В моем случае это @ Html.DropDownList («Выбрать измерения», новый SelectList (Model.Select (i => i.Measurement) .Distinct (). ToList ()), новый {@class="form-control" }). Я передаю свою модель как IEnumerable <mymodel> в представлении. Пожалуйста, объясни :) –  Angela Amarapala 14.06.2017 в 07:26
  • Ну, я думаю, что модель равна нулю. Передаете ли вы это, когда вы возвращаете представление? например return View («ViewName», модель); –  samjudson 15.06.2017 в 08:33
  • Я не проходил мимо какой-либо модели. Теперь понял. Я благодарю вас, отвечая на ваш ответ :) –  Angela Amarapala 16.06.2017 в 12:05