Comment résoudre la valeur ne peut pas être null. Nom du paramètre: source in linq?
Je ne sais pas pourquoi j'obtiens ce genre d'erreur. Cela arrive parfois, et je me méfie de mon code qui a encore du thread en cours d'exécution pendant que je ferme mon Application. Donc quand j'ouvre à nouveau, ça arrive.
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`
Mon code c'est ici
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");
}
}
quand je démarre mon application pour la première fois, il n'y a pas d'erreur. Ça arrive quand j'ouvre dans la 2e ou plus. Et si j'ouvre mon application, ça restera dans ce code.
Comment je peux résoudre ce problème? Je suis assez sûr que ma Propriété ListMetadataKor
n'est pas null
et ListMetadataKor est l'instance de List<Metadata>
objet que j'ai créé. Il arrive dans de rares cas seulement. Et je ne sais pas à résoudre
UPDATE
C'est mon code dans l'image
je remplis ListMetadataKor
avec ce code
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);
}
});
Et puis j'ai lancer la variable par le constructeur de ma classe
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;
Mes outils konsistensi comme ceci
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;
}
3 réponses
message D'erreur indique clairement que source
paramètre null
. La Source est l'énumérable que vous énumérez. Dans votre cas, il est ListMetadataKor
objet. Et c'est certainement null
au moment où vous êtes le filtrage deuxième fois. Assurez-vous de ne jamais attribuer null
à cette liste. Il suffit de vérifier toutes les références à cette liste dans votre code et de chercher des missions.
la valeur ne peut pas être nulle. Nom du paramètre: source
l'erreur ci-dessus se produit lorsque vous interrogez la collection qui est nulle.
pour la démonstration ci-dessous code résultera en une telle exception.
Console.WriteLine("Hello World");
IEnumerable<int> list = null;
list.Where(d => d ==4).FirstOrDefault();
Voici la sortie du code ci-dessus.
Bonjour Tout Le Monde Exception d'exécution (ligne 11): la valeur ne peut pas être nulle. Nom du paramètre: source
Trace De La Pile:
[Système.ArgumentNullException: la valeur ne peut pas être nulle. Nom du paramètre: source] au programme.Main(): ligne 11
dans votre cas ListMetadataKor
est nulle.
Ici est le violon, si vous voulez jouer autour.
Lorsque vous appelez une Linq déclaration comme ceci:
// x = new List<string>();
var count = x.Count(s => s.StartsWith("x"));
vous utilisez en fait une méthode d'extension dans le système.Linq namespace, alors ce que le compilateur traduit en:
var count = Enumerable.Count(x, s => s.StartsWith("x"));
Donc l'erreur que vous obtenez au-dessus est parce que le premier paramètre, source
(ce qui serait x
dans l'exemple ci-dessus) est nulle.