我正在动态地将列添加到!IsPostBack中的静态数据表。
static DataTable dtflow = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
dtp.Columns.Add("slno");
dtp.Columns.Add("portname");
dtp.Columns.Add("type");
dtp.Columns.Add("portid");
dtp.Columns.Add("longitude");
dtp.Columns.Add("latitude");
dtp.Columns.Add("add1");
dtp.Columns.Add("add2");
dtp.Columns.Add("dist");
dtp.Columns.Add("state");
dtp.Columns.Add("country");
}
}
但是当我第二次运行我的网站时,它会显示像这样的例外
异常详细信息:System.Data.DuplicateNameException:名为“slno”的列已属于此DataTable。
有人可以告诉我如何解决这个问题
答案 0 :(得分:3)
static
中的ASP.NET
(多线程)对于所有请求都意味着 ,因此即使是访问此页面的其他用户也使用{{1}的同一个实例}}。所以这就是原因。
解决方案是不要让它静止。
你必须使用不同的方式在回发中维护它(例如Session,ViewState等)。
Nine Options for Managing Persistent User State in Your ASP.NET Application
注意:我甚至不会将它用作字段,而是作为返回它的方法中的局部变量。通过这种方式,您可以在需要该数据的任何地方使用此方法。通常将它绑定到像DataTable
这样的webdatabound控件,它通过GridView
在回发中维护它的值。所以你不需要维护表本身。
答案 1 :(得分:3)
静态数据表意味着无论您的网页实例如何,它都将始终存在。因此,当您第一次运行网页时,您的Page_Load会创建数据表,一切都很好。
但是当您第二次加载该页面或者其他人尝试加载您的页面时,数据表仍然存在,因为它是静态的,因此您尝试在数据表已经存在时向其添加列。
你可以通过3种方式解决这个问题:
1。删除然后再次添加列。不要做这件事,在每个方面都是多余的和坏的代码
2。在dtp.Columns.Adds周围添加if语句,以确保它仅在第一次加载页面时运行它们。你可以查看是否存在columnds,你可以创建一个bool标志,或者你想到的其他方法。
3。从变量声明中删除静态,以便每次页面加载新数据表时都会创建。如果这样做,那么您可能希望将数据表基于静态数据源。