如何从数据集中获取数据

时间:2014-05-29 10:08:12

标签: c# datatable

我的Gridview总是得到null数据表,错误消息:Object reference not set to an instance of an object.,但我不知道丢失了哪些代码。
感谢帮助!!!

.CS

protected void btn_Click(object sender, EventArgs e)
{
        DataSet ds = new DataSet();
        DataTable dt = new DataTable("abc");
        dt = getDT(formatDate); //string[] formatDate ={2013-01-01,2013-05-01..}
        ds.Tables.Add(dt);
        GridView2.DataSource = ds.Tables["abc"].DefaultView; 
         //if change to dt , it works ==> GridView2.DataSource =dt;
        GridView2.DataBind();
    }

}

private DataTable getDT(string[] date)
{
    DataTable dt = new DataTable();

    dt.Columns.Add("RowID", typeof(Int16));
    dt.Columns.Add("Date", typeof(DateTime));

    for (int i = 0; i < date.Length; i++)
    {
        dt.Rows.Add(i + 1, date[i]);
    }
    return dt;
}

2 个答案:

答案 0 :(得分:3)

由于代码 -

Protected void btn_Click(object sender, EventArgs e)
{
        DataSet ds = new DataSet();
        DataTable dt = new DataTable("abc");
        dt = getDT(formatDate);
        ds.Tables.Add(dt);
        GridView2.DataSource = ds.Tables["abc"].DefaultView;
        GridView2.DataBind();
    }

}

private DataTable getDT(string[] date)
{
    DataTable dt = new DataTable();

    dt.Columns.Add("RowID", typeof(Int16));
    dt.Columns.Add("Date", typeof(DateTime));

    for (int i = 0; i < date.Length; i++)
    {
        dt.Rows.Add(i + 1, date[i]);
    }
    return dt;
}

getDT功能中,您再次创建一个没有名称的新DataTable。您应该将表作为参考发送,或者在函数中创建它。以下任一解决方案都可以使用 -

Protected void btn_Click(object sender, EventArgs e)
{
        DataSet ds = new DataSet();
        DataTable dt = new DataTable("abc");
        dt = getDT(dt, formatDate);
        ds.Tables.Add(dt);
        GridView2.DataSource = ds.Tables["abc"].DefaultView;
        GridView2.DataBind();
    }

}

private DataTable getDT(DataTable dt, string[] date)
{
    //DataTable dt = new DataTable();

    dt.Columns.Add("RowID", typeof(Int16));
    dt.Columns.Add("Date", typeof(DateTime));

    for (int i = 0; i < date.Length; i++)
    {
        dt.Rows.Add(i + 1, date[i]);
    }
    return dt;
}

或,

Protected void btn_Click(object sender, EventArgs e)
{
        DataSet ds = new DataSet();
        DataTable dt = getDT(formatDate);
        ds.Tables.Add(dt);
        GridView2.DataSource = ds.Tables["abc"].DefaultView;
        GridView2.DataBind();
    }

}

private DataTable getDT(string[] date)
{
    DataTable dt = new DataTable("abc");

    dt.Columns.Add("RowID", typeof(Int16));
    dt.Columns.Add("Date", typeof(DateTime));

    for (int i = 0; i < date.Length; i++)
    {
        dt.Rows.Add(i + 1, date[i]);
    }
    return dt;
}
编辑:仅适用于HassanNisar @HassanNisar ..这是调试器输出 -

enter image description here

答案 1 :(得分:2)

您应该传递正在创建的DataTable的名称。默认情况下,DataTable没有名称,这就是为什么您无法通过名称abc获取名称。

private DataTable getDT(string name, string[] date)
{
    DataTable dt = new DataTable(name);

    dt.Columns.Add("RowID", typeof(Int16));
    dt.Columns.Add("Date", typeof(DateTime));

    for (int i = 0; i < date.Length; i++)    
        dt.Rows.Add(i + 1, date[i]);        

    return dt;
}

然后创建表格如下:

ds.Tables.Add(getDT("abc", formatDate));

您还可以为日期参数添加空检查。


注意:我建议您改进代码的命名。见C# Naming Guidelines。而且你不需要在这里使用DataSet - 只需绑定到DataTable:

private DataTable CreateDatesTable(IEnumerable<DateTime> dates)
{
    DataTable dt = new DataTable("Dates");

    dt.Columns.Add("RowID", typeof(Int16));
    dt.Columns.Add("Date", typeof(DateTime));

    foreach(var date in dates)        
       dt.Rows.Add(dt.Rows.Count + 1, date); 

    return dt;
}

用法:

protected void btn_Click(object sender, EventArgs e)
{
    var dates = formattedDates.Select(DateTime.Parse);
    GridView2.DataSource = CreateDatesTable(dates);
    GridView2.DataBind();
}