C# Can';不要复制数据表

C# Can';不要复制数据表,c#,asp.net,datatable,C#,Asp.net,Datatable,我有以下代码,用于使用CSV文件中的信息填充数据表 我已将DataTable声明为类属性 public partial class Super_Proyectos_LoadProjects: System.Web.UI.Page { private DataTable dt; private DataTable datosC; string rutaActual; .... } protected void btnLoad_Click(object sender, E

我有以下代码,用于使用CSV文件中的信息填充数据表

我已将DataTable声明为类属性

public partial class Super_Proyectos_LoadProjects: System.Web.UI.Page
{
   private DataTable dt;
   private DataTable datosC;
   string rutaActual;
   ....
}


protected void btnLoad_Click(object sender, EventArgs e)
{
    if(fupCSV.HasFile)
    {
        try
        {
            string csvPath = Server.MapPath("~/Projects/") + Path.GetFileName(fupCSV.PostedFile.FileName);
            fupCSV.SaveAs(csvPath);

            dt = new DataTable();                
            dt.Columns.AddRange(new DataColumn[8] { new DataColumn("Project ID", typeof(string)), new DataColumn("Worker ID", typeof(string)),
                                new DataColumn("Project Name", typeof(string)));
            dt.TableName = "Project";

            string csvData = File.ReadAllText(csvPath);


            foreach(string row in csvData.Split('\n'))
            {
                if(!string.IsNullOrEmpty(row))
                {
                    dt.Rows.Add();
                    int i = 0;

                    foreach (string cell in row.Split(','))
                    {
                        dt.Rows[dt.Rows.Count - 1][i] = cell;
                        i++;
                    }
                }                    
            }                                   

            gvProyectos.DataSource = dt;
            gvProyectos.DataBind();                
        }
        catch(Exception)
        {
            string script = @"<script type='text/javascript'>
                        alert('Error al cargar los datos.');
                    </script>";

            ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false);
        }            
    }
}
但是,当我单击“接受”按钮时,会出现以下错误:

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


为什么在加载数据表的外部使用该数据表时会出错?

调试代码,您会看到在某个地方,您正在对空值对象(可能是存储在
dt.Rows[0][0]
中的值)调用一个函数。为什么您首先要将它放在数据表中?为什么不把它放到强类型对象中?为什么要在页面中使用字段,并希望它们在回发过程中保持不变?(提示,他们不会)奇怪,我刚刚在一小时前回答了这个问题的另一个版本谢谢你的回答。嗨@mason你能解释一下为什么我不能使用字段吗?正确的方法是什么?Thank you字段(也称为实例变量)特定于该类的实例,在本例中,
Super\u Proyectos\u LoadProjects
,这是您的页面类。对服务器的每个请求都会导致page类的一个新实例,因此所有实例变量都将被丢弃。当您单击按钮或从ASP.NET页面触发服务器端事件时,将导致新的回发,这是一个新的HTTP请求。因此,
dt
不会在回发之间持续存在。您应该做的是将数据加载到强类型模型中(创建一个新类,而不是使用DataTable)
protected void btnAccept_Click(object sender, EventArgs e)
{
    Response.Write(dt.Rows[0][0].ToString());
}