通过 SQL Server 数据库在 WPF 列表框中获取 System.NullReferenceException [重复]

Posted

技术标签:

【中文标题】通过 SQL Server 数据库在 WPF 列表框中获取 System.NullReferenceException [重复]【英文标题】:Getting System.NullReferenceException in a WPF listbox over a SQL Server database [duplicate] 【发布时间】:2021-10-16 06:19:44 【问题描述】:

我一直在学习 C#,并且一直在观看 Udemy 课程。我对 SQL 的了解非常有限。我正在观看一场讲座,现在我正在按照步骤制作一个简单的 WPF 应用程序,该应用程序将显示来自两个表的数据,并让我添加、删除或更新两个表中的数据。

代码如下:

XAML 标记:

<Window x:Class="SQL_Application_WPF.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:SQL_Application_WPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="558.579" Width="641.957">
    <Grid>
        <Label Content="Zoo List" HorizontalAlignment="Left" Margin="30,10,0,0" VerticalAlignment="Top" Width="140" Height="33"/>
        <ListBox Name="ZooList" HorizontalAlignment="Left" Height="210" Margin="30,48,0,0" VerticalAlignment="Top" Width="140"/>
    </Grid>
</Window>

C#代码:

using System;
using System.Windows;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;

namespace SQL_Application_WPF

    public partial class MainWindow : Window
    
        SqlConnection sqlConnection;

        public MainWindow()
        
            string connectionString = ConfigurationManager.ConnectionStrings["SQL_Application_WPF.Properties.Settings.SQLAppLearningConnectionString"].ConnectionString;

            sqlConnection = new SqlConnection(connectionString);

            ShowZoos();
        

        private void ShowZoos()
        
            try
            
                string query = "SELECT * FROM Zoo";

                // The SqlDataAdapter can be imagined to be a sort of an interface to make Tables usable by C# Objects
                SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(query, sqlConnection);

                using (sqlDataAdapter)
                
                    DataTable zooTable = new DataTable();
                    sqlDataAdapter.Fill(zooTable);

                    //Information that will be displayed in the List Box from the Table in DataTable. 
                    ZooList.DisplayMemberPath = "Location";

                    //Value that will be delivered when an item from the List Box is selected
                    ZooList.SelectedValuePath = "Id";

                    //The reference to the DataTable should populate.
                    ZooList.ItemsSource = zooTable.DefaultView;
                
            
            catch (Exception e)
            
                MessageBox.Show(e.ToString());
            
        
    

当我运行这段代码时,我在下面一行得到一个System.NullReferenceException

ZooList.DisplayMemberPath = "Location";

我不知道是什么原因造成的。我已经确保列的名称也正确匹配,但由于我目前的知识还处于起步阶段,我不知道这可能是什么原因。

非常感谢任何反馈或意见。

【问题讨论】:

尝试添加 InitializeComponent(); ShowZoos() 之前;重建并再次运行。成功了吗? 【参考方案1】:

试试这个:

      SqlConnection sqlConnection;
        public MainWindow()
        

            string connectionString = ConfigurationManager.ConnectionStrings["SQL_Application_WPF.Properties.Settings.SQLAppLearningConnectionString"].ConnectionString;
            sqlConnection = new SqlConnection(connectionString);
            
            InitializeComponent(); //readies the controls in the visual tree so your code can access them properly, avoiding null ref errors

            ShowZoos();

        

【讨论】:

是的,这行得通。我现在看到 ListBox 中的所有数据。谢谢!【参考方案2】:

这是一个没有适当调试技能的问题。在这种情况下,我猜ZooList 为空。

我假设您使用的是 Visual Studio。对吗?

这是您在 Visual Studio 中查明任何异常的方法。

    打开异常设置窗口(调试 >> Windows >> 异常设置) 找到您要查找的异常的名称。在托管应用程序中,它可能会在“公共语言运行时异常”下面尝试将其输入到搜索框中。在这种情况下,键入“NullRef”。这将显示“System.NullReferenceException”确保已选中。 运行应用程序的调试版本。做任何你必须做的事情来解决问题。调试器将在抛出异常的那一刻停止 查看“Autos”或“Locals”调试器窗口。检查进入调用的所有变量的值。其中一个不应该为 null,但它会为 null 要么找出原因(在该函数中)为什么不应该为空的值是空的,或者,如果它是传递给函数的参数,则调出调用堆栈窗口并开始单击上一层并再次向上,直到找到生成该空参数的函数的来源。

【讨论】:

感谢您的评论。以后我会尝试使用它,这样我就可以准确地找出我的问题所在。【参考方案3】:

调用 MainWindow() 时,UI 元素尚未准备好,即 ZooList 尚未创建。为了解决这个问题,您应该在窗口加载后查询数据库并设置UI元素,这由Loaded事件指示。

xaml

<Window x:Class="SQL_Application_WPF.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:SQL_Application_WPF"
    mc:Ignorable="d"
    Title="MainWindow" Height="558.579" Width="641.957"
    Loaded="Window_Loaded"
    >

代码隐藏

private void Window_Loaded(object sender, RoutedEventArgs e)

    ShowZoos();
 

【讨论】:

您的回答也对我有用。谢谢!

以上是关于通过 SQL Server 数据库在 WPF 列表框中获取 System.NullReferenceException [重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过 C# WPF App 使用 XML 更新并插入 SQL Server 数据库

使用 SQL Server 处理 WPF 应用程序中的大型数据集

实体框架 + SQL Server Compact + WPF/WinForms = 缓慢的 UI?

在 WPF 应用程序中未安装 SQL Server CE 4.0 的用法

连接 WPF 和 SQL Server 的最佳实践

使用嵌入式 SQL Server CE 数据库更新 WPF 应用程序