Komunikat: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

0

Witam Państwa,

jestem początkującym programistą C# na WPF i mam raczej banalny problem.

Przykład:
W nowym projekcie na gridzie dodaje dwa pola tekstowe(TextBox) o nazwach txt_input i txt_output
Do pola txt_input przypisuje handlera TextChanged.
Każda zmiana tekstu ma powodować wyświetlenie się tego tekstu w drugim polu txt_output.

Cały kod C# poniżej:

 
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 WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void txt_input_TextChanged(object sender, TextChangedEventArgs e)
        {
            this.txt_output.Text = this.txt_input.Text;
        }
    }
}

Wyskakuj mi błąd w tej linii this.txt_output.Text = this.txt_input.Text; o treści:
A first chance exception of type 'System.NullReferenceException' occurred in WpfApplication1.exe
An exception of type 'System.NullReferenceException' occurred in WpfApplication1.exe but was not handled in user code
Additional information: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

Proszę o pomoc. W Windows Form nie miałem takiego problemu z przypisaniem wartości do innego pola tekstowego
Na logikę nie widzę w kodzie błędu.

0

zmodyfikowałem funkcję i jest taki sam błąd:

private void txt_input_TextChanged(object sender, TextChangedEventArgs e)
        {
            //this.txt_output.Text = this.txt_input.Text;
            this.txt_output.Text = "test";
        }

budowa XAML

 
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox x:Name="txt_input" HorizontalAlignment="Left" Height="23" Margin="56,100,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" TextChanged="txt_input_TextChanged"/>
        <TextBox x:Name="txt_output" HorizontalAlignment="Left" Height="23" Margin="314,106,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>

    </Grid>
</Window>
1
private void txt_input_TextChanged(object sender, TextChangedEventArgs e)
        {
            //this.txt_output.Text = this.txt_input.Text;
            this.txt_output.Text = "test";
        }
 

Zostaje wywołany przed :

Initialize tych textboxów.
Po inicjalizacji txt_input zostaje wywołany event przed inicjalizacją txt_output. Stąd błąd.
Tak więc dla kompilatora one istnieją ale są nullami.

Wywal wartości z pola TEXT obu. (Albo tylko z tego dla którego jest wywoływany Event Text_Change).
Ew. sprawdzenie czy textbox != null i dopóki jest nie wykonuj operacji.
Ew. Zmień kolejność textboxów w dokumencie
I będzie śmigać :)

1

@Wojski wydaje mi się, że event nie jest wywoływany przed inicjalizacją obu tych elementów. Jest wywołany gdy tworzony jest txt_inputco skutkuje tym, że txt_output jest niezainicjowany, czyli jest nullem. Powodem wywołania eventu jest oczywiście to, że pierwszy element posiada tekst.

2

Można by to też załatwić w samym xamlu:

<TextBox x:Name="InputTextBox"/>
<TextBox x:Name="OutputTextBox" Text="{Binding ElementName=InputTextBox, Path=Text, Mode=OneWay}"></TextBox>

o ile jakaś pozostała logika nie przeszkadza takiemu podejściu. ;)

0

Dzięki Panowie

Działa!!

w XAML odwróciłem kolejność TextBox-ów i działa poprawnie.

Czyli Handel odnosił się do komponentu, który jeszcze nie powstał w kodzie XAML

Czyli na chłopski rozum program jest kompilowany na zasadzie
XAML obiekt 1 > kod C# dotyczący obsługi obiektu 1 >
XAML obiekt 2 > kod C# dotyczący obsługi obiektu 2 > itd

0

Tak ogólnie rzecz biorąc wszystko co tworzysz w xaml jest generowane do kodu c#. Czemu w Twoim przypadku wystąpił System.NullReferenceException? Ponieważ najpierw stworzony został obiekt txt_input któremu przypisałeś na starcie wartość przez co od razu został wywołany txt_input_TextChanged ale jeszcze nie zdążył znacjonalizować się kolejny obiekt txt_output a już chciałeś wpisać mu wartość stąd pojawił się błąd. Jak byś odwrócił kolejność obiektów zamiast:

 <TextBox x:Name="txt_input" HorizontalAlignment="Left" Height="23" Margin="56,100,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" TextChanged="txt_input_TextChanged"/>
        <TextBox x:Name="txt_output" HorizontalAlignment="Left" Height="23" Margin="314,106,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>

dał

<TextBox x:Name="txt_output" HorizontalAlignment="Left" Height="23" Margin="314,106,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
<TextBox x:Name="txt_input" HorizontalAlignment="Left" Height="23" Margin="56,100,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" TextChanged="txt_input_TextChanged"/>

czyli zamienił kolejnością program nie powinien się wyburaczyć. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1