Node.js APIから取得したJSON応答に従って、名前付きStackPanelにボタンを動的に追加しようとしています。このJSON配列をオブジェクト配列に解析します。オブジェクトには、すべての属性を適切な場所に配置するためのクラスがあります。次に、foreachで、オブジェクト配列に入力した情報を使用してボタンを作成します。オブジェクト配列には適切な属性が含まれていることに注意してください。 foreachで単にMessageBox.Show(item.name)
を実行しようとすると、すべてのオブジェクトのすべての名前が表示されます。 nullの値はありません。3回チェックしました。
これが私がボタンを作成する方法です:
ItemList[] items = JsonConvert.DeserializeObject<ItemList[]>(jsonString);
Dispatcher.BeginInvoke(new Action(() =>
{
foreach (ItemList item in items)
{
Button ItemName = new Button();
//defining properties of the button, like width, etc..
ItemName.Content = item.title;
ItemName.Name = item.id;
//Will add Click event.
ItemPanel.Children.Add(ItemName);
}
}));
そして、試行すると、TargetInvocationExceptionが発生します:
[System.Reflection.TargetInvocationException {System.Reflection.TargetInvocationException:呼び出しのターゲットによって例外がスローされました。 ---> System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。
何故ですか ?神秘。ボタンオブジェクトを作成して、他に何もせずにStackPanelに追加しようとしましたが、エラーは同じです。
私は何が間違っているのですか?これを取り除く方法は?私はすでに別のアプリでそのような動的要素を作成しましたが、それは機能していました。
関数作成ボタンは、HTTPリクエストを使用してAPIからJSONを取得する関数の最後に呼び出されます。そのHTTPリクエスト関数はOnNavigatedToメソッドで呼び出されます(ええ、それは奇妙ですが、OnNavigatedToメソッドからの変数を使用して、ページに到達したときに関数を自動的に呼び出す唯一の方法です。他のページで実行しました。動作しています(ボタンは作成されていませんが、既存のテキストブロックを変更するだけです)。
これが完全なエラーです:
System.Reflection.TargetInvocationException:
Exception has been thrown by the target of an invocation. --->
System.NullReferenceException: Object reference not set to an instance of an object.
at CubbyHole_Mobile.BrowseFiles.<>c__DisplayClass1.b__0()
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.UnsafeInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.Windows.Threading.DispatcherOperation.Invoke()
そして、これがスタックトレースです:
CubbyHole Mobile.DLL!CubbyHole_Mobile.App.Application_UnhandledException(object sender, System.Windows.ApplicationUnhandledExceptionEventArgs e) Ligne 100 C#
System.Windows.ni.dll!MS.Internal.Error.CallApplicationUEHandler(System.Exception e) Inconnu
System.Windows.ni.dll!MS.Internal.Error.IsNonRecoverableUserException(System.Exception ex, out uint xresultValue) Inconnu
System.Windows.ni.dll!System.Windows.Threading.DispatcherOperation.Invoke() Inconnu
System.Windows.ni.dll!System.Windows.Threading.Dispatcher.Dispatch(System.Windows.Threading.DispatcherPriority priority) Inconnu
System.Windows.ni.dll!System.Windows.Threading.Dispatcher.OnInvoke(object context) Inconnu
System.Windows.ni.dll!System.Windows.Hosting.CallbackCookie.Invoke(object[] args) Inconnu
System.Windows.RuntimeHost.ni.dll!System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(System.IntPtr pHandle, int nParamCount, System.Windows.Hosting.NativeMethods.ScriptParam* pParams, System.Windows.Hosting.NativeMethods.ScriptParam* pResult) Inconnu
(申し訳ありませんが、フランス語のVSですが、読みやすいはずです)
また、新しく作成されたアイテムを既存のStackPanelに追加しようとするとエラーがスローされますが、その行で停止することはできません。 UnhandledExceptionメソッドでapp.xaml.csに移動し、Debugger.Break()で停止します。 (これに取り組んでいる間に私が持っていたほとんどすべてのエラーのように)。
わかりました..私はちょうどそれを理解しました。それはコードエラーではありませんでした。どういたしまして。まあ、実際には私のコードではありません。
無駄に試すのにうんざりして、私は休憩のためにVisualStudioを保存して閉じました。それから私は戻ってきましたそして..それは働きます。何も触れずに。コードを十数回変更しようとした後、ソリューション全体を数回再生成した後、最後にVSを再起動することで解決しましたか?神様私はそのようなことを嫌います..その日のために私は夢中になります。
さて、みんなのおかげで答えました!
ItemPanel
がnullではないことを確認しますか?すべてが.Children.Add()
でクラッシュする場合、それが最も可能性の高いシナリオです。