通过 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?