在使用 C# 绑定 DataTable 到 DataGridView 时,出现了“对象引用未设置到对象实例”错误。

4

我想要将窗口表单中的多个值保存到 datatable 中,然后将这个表格绑定到 Datagridview。 值被添加到 Datatable 中,但是在:

dataGridViewX1.DataSource = dt.DefaultView.Table);

绑定点错误显示

对象引用未设置为对象的实例

我该如何解决它?

public AddOrder(string ItemName,int Qty,Double Price)
    {


        try
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("id");
            dt.Columns.Add("Item Name");

            dt.Columns.Add("Qty");
            dt.Columns.Add("Unit Price");
            dt.Columns.Add("Amounts");


            DataRow dr = dt.NewRow();
            dr["id"] = a;
            a++;

            dr["Item Name"] = ItemName;
            dr["Qty"] = Qty;
            dr["Unit Price"] = Price;
            dr["Amounts"] = (Convert.ToInt32(dr["Qty"]) * Convert.ToInt32(dr["Unit Price"]));
            dt.Rows.Add(dr);

            dataGridViewX1.DataSource = dt.DefaultView.Table;

        }
        catch(Exception ee)
        {
            DevComponents.DotNetBar.MessageBoxEx.Show(ee.Message,"Error Message");
        }
    }

1
你尝试过使用 "dataGridViewX1.DataSource = dt;" 吗? - Nitin Varpe
是的,我使用 dataGridViewX1.DataSource = dt;。 - ziakhan
这个问题的空引用问题与其重复链接的问题太笼统了。实际上,问题是为什么绑定到DataGridView会生成空引用异常。 - James Lawruk
8个回答

2
对象引用异常可能发生在与数据绑定相关的事件处理程序中。例如,假设您的数据网格在标记中有以下内容:
<asp:GridView ID="GridView1" OnRowDataBound="GridView1_RowDataBound"

当您调用 GridView1.DataBind() 时,GridView1_RowDataBound 方法会在数据绑定过程中为每一行执行。该方法可能包含一些糟糕的代码,导致出现 "object reference..." 异常。

1
在InitializeComponent方法中,dataGridViewX1的初始化是吗?
    I Think it is parameterized constructor I it does not has initialization of controls

1) 解决方案
   InitializeComponent(); need to call this method.

它正在运行我的应用程序


0

data table 直接赋值给 gridview

dataGridViewX1.DataSource = dt;

改为:

dataGridViewX1.DataSource = dt.DefaultView.Table;

感谢您对此代码的回复(dataGridViewX1.DataSource = dt;),但问题仍然存在。 - ziakhan
请在您的问题中更新异常的堆栈跟踪。 - Shaharyar

0

在代码中设置断点,检查你是否有值

- dr["Qty"] = Qty;

 - dr["Unit Price"] = Price;

很可能其中一个或两个值为空。

或者尝试这个并检查。

 - dr["Qty"] = 3;

  - dr["Unit Price"] = 4;

感谢您的回复,我已经尝试了这段代码(dataGridViewX1.DataSource = dt;),但问题仍然存在。 - ziakhan
在dt中存在一条记录,但当我将其绑定到DataGridViewX1时,就会导致“对象引用未设置为对象的实例”错误。 - ziakhan

0

你的代码在绑定方式上是有效的。

我通过定义缺失的变量(a)使其工作:

    AddOrder("something", 2, 100);  
    ...
    //assign some default value since the PO did not define the variable at all...
    int a=0;

现在,建议您像这样为列指定数据类型:

        dt.Columns.Add("Qty",typeof(int));
        dt.Columns.Add("Unit Price",typeof(Decimal));
        dt.Columns.Add("Amounts",typeof(Decimal));

此外,如果您计划编辑数据,则在保护金额后,应使用以下列的表达式:
dt.Columns.Add("Amount", typeof(Decimal), "Qty *[Unit Price]");

更新:

假设错误发生在绑定时,请尝试以下操作:

dataGridViewX1.DataSource = null;
dataGridViewX1.DataSource = dt.DefaultView;

什么问题?请给出具体的错误。你是否遇到了异常?异常信息是什么? - NoChance
异常信息:对象引用未设置到对象实例。 - ziakhan
这很奇怪,请尝试查看答案中的更新...另外,进行调试跟踪并在绑定之前查看dt是否为空。 - NoChance
是的,亲爱的,Method和DataGridView都在表单上。 - ziakhan
dt 不为 null,它有一条记录。 - ziakhan
这很奇怪。我几乎无法想象您会以这种方式遇到绑定错误。也许您没有使用标准的DataGridView组件... - NoChance

0
private void BindDataGrid()
{
    DataTable table = new DataTable();

    // Insert code to populate a DataTable with data. 

    // Bind grid to DataTable.
    dataGrid1.DataSource = table;
}

0

使用

dataGridViewX1.DataSource = dt;

插入断点以查看dt的值。


-1

这个错误是由于您试图访问一个空对象的属性而引起的。

每当您遇到这种错误时,可以尝试逐步调试源代码。这将帮助您找到抛出错误的行。

您可以查看哪个对象为空,然后通过找出为什么该对象在您的代码中为空来修复此错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接