Страницы

Поиск по вопросам

воскресенье, 16 февраля 2020 г.

System.Reflection.TargetInvocationException: “Адресат вызова создал исключение.”

#c_sharp #wpf


На событии TextChanged возникает ошибка


  System.Reflection.TargetInvocationException: “Адресат вызова создал
  исключение.” Внутреннее исключение NullReferenceException: Ссылка на
  объект не указывает на экземпляр объекта.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
/// 
/// Логика взаимодействия для MainWindow.xaml
/// 
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void TextBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox2.Text = TextBox1.Text;
    }
}
}



Разметка

Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">

    
            
            
        
        
        





    


Ответы

Ответ 1



Перепишите код вот так! private void TextBox1_TextChanged(object sender, TextChangedEventArgs e) { if (TextBox2 != null) { TextBox2.Text = TextBox1.Text; } } При первом визове этого события у вас еще не создана екземпляр MainWindow,следовательно и еще не работала функция InitializeComponent() и вы пытетесь получить еще не созданную TextBox2.

Ответ 2



Проблема в том, что, как правильно замечает @Vardan Vardanyan, интерпретация XAML, а значит, назначение обработчиков событий и привязка имён происходит во время выполнения InitializeComponent. При этом порядок этих операций не определён. В вашем случае порядок был следующим: установился обработчик TextChanged установилось значение Text в "TextBox", при этом вызвался обработчик далее переменной TextBox2 должно было быть присвоено значение, соответствующее текстбоксу, но это не успело произойти, т. к. на предыдущем шаге случилось исключение. (Заметьте, что стандарта на порядок выполнения этих операций нет, любой порядок возможен.) Вы можете игнорировать событие во время InitializeComponent, проверяя TextBox2 на равенство null. Но более чистым решением мне кажется подписка на событие после отработки InitializeComponent. Для этого нужно убрать TextChanged="TextBox1_TextChanged" из XAML и добавить в конструктор: public MainWindow() { InitializeComponent(); TextBox1.TextChanged += TextBox1_TextChanged; TextBox1_TextChanged(null, null); // обновить значение прямо сейчас }

Комментариев нет:

Отправить комментарий