【问题标题】:Passing objects to user control and + Object reference not set to an instance of an object将对象传递给用户控件和 + 对象引用未设置为对象的实例
【发布时间】:2013-01-05 05:41:23
【问题描述】:

我的问题是.. 我有一个 UserControl,我在上面放置了一个 DataGridView 和一个按钮。 在这个控件上,我有这三个变量:

namespace MySpace
{
    public partial class PanelWithDataGrid : UserControl
    {
        public DatabaseMenager FDatabaseManager { get; set; }
        public SqlCeDataAdapter FDataAdapter { get; set; }
        private DataTable FDataTable { get; set;  }
        [...]

构造函数如下所示:

public PanelWithDataGrid()
        {
            InitializeComponent();
        }

而且..我有一个看起来像这样的方法:

public void Initialize(DatabaseMenager pDatabaseManager, DataTable pDataTable, SqlCeDataAdapter pDataAdapter)
        {
            FDataAdapter = pDataAdapter;
            FDatabaseManager = pDatabaseManager;
            FDataTable = pDataTable;
        }

而且.. 我还有一个按钮,它有一个如下所示的点击事件:

private void btnAccept_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("Accept changes?", "Accept?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    FDataTable.AcceptChanges();
                    FDataAdapter.Update(FDataTable);
                }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(String.Format("Error:\n\n{0}", ex.StackTrace));
            }
        }

现在进入重点:

  1. 在拥有此组件的表单中,我运行“初始化”方法。

  2. 它显示我不想显示的数据。

  3. 然后我在 datagridview 的单元格中更改了一些值。

  4. 但是当我点击这个控件的“接受”按钮时,应该 接受更改并更新连接的数据表 到datagridview - 有一个错误说“对象引用不是 设置为对象的实例。”

请帮忙..

【问题讨论】:

  • 什么时候调用 Initialize()?这很可能是页面生命周期的问题,在 btnAccept_Click 方法之后调用 Initialize()。
  • 在失败的位置下断点,查看变量值。有空值吗?
  • asawyer: FDataTable.AcceptChanges();这个控件是通过将它放在 AdminPanel 中名为“AdminPanel”的表单上创建的,我有一个看起来像这样的构造函数InitializeComponent(); pwdgvWorkers.Inicialize(FDatabaseManager, FDatabaseManager.FAdmin_WorkersDataTable, FDatabaseManager.FAdmin_WorkersDataAdapter);
  • 变量为空,但在拥有此控件的管理面板中,变量是可访问的;/
  • FDatabaseManager.FAdmin_WorkersDataAdapter 为空。回溯到FDatabaseManager 看看为什么。

标签: c# user-controls


【解决方案1】:

问题解决了。

这个组件 - PanelWithDataGrid - 被放置在一个名为 AdminPanel 的组件上。

AdminPanel 正在执行一个方法Initialize,它将数据适配器和数据表传递给 PanelWithDataGrid 组件。这些变量是空的,因为它们是在 Initialize 方法之后创建的..

所以这个问题的解决方案是在运行Initialize 方法之前创建一个SqlCeDataAdapter 和另一个Datatable 的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多