【问题标题】:DataTable values cannot be accessed (even defined Table schema is not there)无法访问 DataTable 值(即使已定义的表架构也不存在)
【发布时间】:2012-03-16 13:20:05
【问题描述】:

ASP.Net:

<asp:GridView id ="sampleGridView" AutoGenerateEditButton ="True" OnRowEditing ="sampleGridView_RowEditing" OnRowCancelingEdit ="sampleGridView_RowCancelingEdit" OnRowUpdating ="sampleGridView_RowUpdating" runat ="server"></asp:GridView>

代码背后:

public partial class _Default : System.Web.UI.Page
{
    private DataTable dt = new DataTable("SampleTable");

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack){
           PopulateGridView();     
        }
    }
    private void PopulateGridView()
    {
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("Desgnation", typeof(string));
        dt.Columns.Add("City", typeof(string));
        for (int i = 0; i < src.GetLength(0); i++)
        {
            dt.Rows.Add(src[i, 0], src[i, 1], src[i, 2]);
        }
        sampleGridView.DataSource = dt;
        sampleGridView.DataBind();

    }
    protected void sampleGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        GridViewRow row = sampleGridView.Rows[e.RowIndex];
        //Response.Write(src[1,0]+" "+ dt.Rows[0][0]);
        dt.Rows[row.DataItemIndex]["Name"] = ((TextBox)(row.Cells[1].Controls[0])).Text;
        dt.Rows[row.DataItemIndex]["Desgnation"] = ((TextBox)(row.Cells[1].Controls[0])).Text;
        dt.Rows[row.DataItemIndex]["City"] = ((TextBox)(row.Cells[3].Controls[0])).Text;
    }
}

System.IndexOutOfRangeException: 位置 {Row Number} 处没有行说 2. 是 sampleGridView_RowUpdating 行中的错误

dt.Rows[row.DataItemIndex]["Name"] = ((TextBox)(row.Cells[1].Controls[0])).Text;

我尝试以下代码注释掉上面的错误生成代码

Response.Write(dt.Columns.Count+" "+dt.TableName);

输出是:
0 样本表

为什么不能访问数据表的值?

【问题讨论】:

  • 这是一个猜测,因为您的源代码不完整购买您是否记得调用 PopulateGridView 或从诸如回发会话变量之类的东西中获取数据表
  • 数据表不是会话变量。它是类的成员变量

标签: c# asp.net gridview datatable


【解决方案1】:

当您手动填充页面的成员时,如果您需要在回发之间保留它,则需要对每个请求执行此操作。这通常使用会话状态来完成。

例如

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack){
           PopulateGridView();     
        }
        else
        {
           dt = (DataTable)Session["YourDatatable"]; //retrieve it from session
           sampleGridView.DataSource = dt;
           sampleGridView.DataBind();
        }
    }
    private void PopulateGridView()
    {
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("Desgnation", typeof(string));
        dt.Columns.Add("City", typeof(string));
        for (int i = 0; i < src.GetLength(0); i++)
        {
            dt.Rows.Add(src[i, 0], src[i, 1], src[i, 2]);
        }
        sampleGridView.DataSource = dt;
        sampleGridView.DataBind();

        Session["YourDatatable"] = dt; //Store it for later

    }

【讨论】:

    【解决方案2】:

    我认为您应该尝试使用这种方式在表格中添加行:

      for (int i = 0; i < src.GetLength(0); i++)
        {
            DataRow dr = dt.NewRow();
            dr[0] = src[i, 0];
            dr[1] = src[i, 1]; 
            dr[2] = src[i, 2];
            dt.Rows.Add(dr);
        }
        sampleGridView.DataSource = dt;
        sampleGridView.DataBind();
    

    【讨论】:

    • 问题不在于 Add() 方法的语法。问题是数据表对象中没有列也没有行(意味着没有数据)。
    • 尝试在 DataTable 对象中声明为protected 而不是private。看看会发生什么?
    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 2016-11-05
    • 2022-01-23
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多