6

我正在将列动态添加到!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”的列已属于此数据表。

谁能告诉我如何解决这个问题

4

2 回答 2

3

staticin ASP.NET(multi-threaded) 表示所有请求,因此即使是另一个访问此页面的用户也使用相同的DataTable. 所以这已经是原因了。

解决方案是不要让它成为静态的。

您必须使用不同的方式在回发中维护它(例如,Session、ViewState 等)。

在 ASP.NET 应用程序中管理持久用户状态的九个选项

注意:我什至不会将它用作字段,而是用作返回它的方法中的局部变量。通过这种方式,您可以在需要该数据的任何地方使用此方法。通常你将它绑定到一个 webdatabound 控件,比如GridView通过ViewState. 所以你不需要维护表本身。

于 2013-03-16T12:10:30.003 回答
3

静态数据表意味着无论您的网页实例如何,它都将始终存在。因此,当您第一次运行网页时,您的 Page_Load 会创建数据表并且一切正常。

但是,当您第二次加载该页面或其他人尝试加载您的页面时,数据表仍然存在,因为它是静态的,因此您尝试在数据表已经存在时将列添加到您的数据表中。

解决此问题的 3 种方法:
1.删除然后再次添加列。永远不要这样做,它在各个方面都是冗余和糟糕的代码。
2.在 dtp.Columns.Adds 周围添加一个 if 语句,以确保它只在第一次加载页面时运行它们。您可以检查列是否存在,您可以创建一个布尔标志,或者您想到的其他方式。
3.从变量声明中删除静态,以便每次页面加载时都会创建一个新的数据表。如果您这样做,那么您可能希望基于静态数据源的数据表。

于 2013-03-16T12:12:47.657 回答