WPF:使用与数据表绑定的列表框中的值

本文关键字:列表 绑定 数据表 WPF | 更新日期: 2023-09-27 18:29:34

我是新来的,这是我的第一个问题。

我正在设计一个文本块,当我更改文本时,它可以查询我的数据库。之后,用户可以在列表框中选择一个值,然后文本块应该将其值更改为已选择的值。

当我使用Messagebox.Show时,我成功地检索到了我在列表框中选择的值,但当我再次更改文本块中的值,或者我想更改文本块的值时,VS显示一条带有System.NullReferenceException的错误消息。

我想了解根本原因,这样我将来就可以避免它。我还想知道是否可以从列表框中重定时多个记录。非常感谢!

下面是我的XAML代码:

<Grid>
    <Label Content="Label" HorizontalAlignment="Left" Margin="40,38,0,0" VerticalAlignment="Top"/>
    <TextBox x:Name="Searchbox" HorizontalAlignment="Left" Height="23" Margin="85,38,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="216" TextChanged="Read_DB"/>
    <Button Content="Button" HorizontalAlignment="Left" Height="24" Margin="321,37,0,0" VerticalAlignment="Top" Width="70"/>
    <ListBox x:Name="result_box" ItemsSource="{Binding}" Margin="85,61,216,155" SelectionChanged="result_box_SelectionChanged" />
</Grid>

以下是背后的代码:

public MainWindow()
    {
        InitializeComponent();
    }
    private void Read_DB(object sender, TextChangedEventArgs e)
    {
        SQLite_Class SQLite = new SQLite_Class();
        string sql_command = "Select  * from mytable where name like '%" +Searchbox.Text + "%' limit 10";
        DataTable listdata = SQLite.data_query(sql_command, "mydb.db");
        result_box.Visibility = Visibility.Visible;
        result_box.ItemsSource = listdata.DefaultView;
        result_box.DisplayMemberPath = "name";
        result_box.SelectedValuePath = "ID";            
    }
    private void result_box_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ListBox lb = sender as ListBox;
        DataRowView view = lb.SelectedItem as DataRowView;
        string test = view["ID"].ToString();
        MessageBox.Show(test);
        Searchbox.Text = test;
        //result_box.Visibility = Visibility.Hidden;
    }

WPF:使用与数据表绑定的列表框中的值

最后我找到了一个解决方案。只需要在datarowview不为null时更改show操作就可以完美地解决这个问题。

private void result_box_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DataRowView view = result_box.SelectedItem as DataRowView;
            if (view != null)
            {                    
                MessageBox.Show(view["ID"].ToString());
                Searchbox.Text = view["ID"].ToString();
            } 
    }