你调用的对象是空的。在c#中将数据表绑定到datagridview时

时间:2014-01-01 06:44:42

标签: c# winforms exception datagridview 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");
        }
    }

8 个答案:

答案 0 :(得分:1)

直接将data table分配给gridview

dataGridViewX1.DataSource = dt;

而不是:

dataGridViewX1.DataSource = dt.DefaultView.Table;

答案 1 :(得分:1)

是在InitializeComponent方法中初始化 dataGridViewX1 吗?

    I Think it is parameterized constructor I it does not has initialization of controls

1)解决方案

   InitializeComponent(); need to call this method.

它正在使用我的应用程序

答案 2 :(得分:1)

对象引用异常可能发生在与数据绑定相关的事件处理程序中。例如,假设您的数据网格在标记中具有类似的内容:

<asp:GridView ID="GridView1" OnRowDataBound="GridView1_RowDataBound"

当您调用GridView1.DataBind()时,在数据绑定过程中为每一行执行GridView1_RowDataBound方法。此方法可能包含一些错误代码,以便为您提供“对象引用...”异常。

答案 3 :(得分:0)

放置一个断点并检查你是否有价值

- dr["Qty"] = Qty;

 - dr["Unit Price"] = Price;

最有可能其中一个或两个都有空值。

或尝试此操作并检查

 - dr["Qty"] = 3;

  - dr["Unit Price"] = 4;

答案 4 :(得分: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;

答案 5 :(得分:0)

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

    // Insert code to populate a DataTable with data. 

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

答案 6 :(得分:0)

使用

dataGridViewX1.DataSource = dt;

插入断点以查看dt值。

答案 7 :(得分:-1)

此错误是由于尝试访问空对象的属性所致。

每当出现此类错误时,您都可以尝试逐步调试和调试源代码。 这将帮助您到达引发错误的行。

您可以查看哪个对象为空,然后通过弄清楚代码中为什么该对象为空来解决此错误。