2013-03-16 32 views
5

Tôi đang thêm cột động vào bảng Dữ liệu tĩnh trong! IsPostBack.System.Data.DuplicateNameException trong DataTable

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"); 
     } 
    } 

Nhưng khi tôi chạy trang web của tôi cho lần thứ hai nó cho thấy một ngoại lệ như thế này

Ngoại lệ chi tiết: System.Data.DuplicateNameException: Một cột có tên 'slno' đã thuộc về DataTable này.

Ai có thể cho tôi biết làm thế nào để giải quyết vấn đề này

Trả lời

2

Dữ liệu tĩnh có nghĩa là nó sẽ luôn ở đó bất kể trường hợp trang web của bạn là gì. Vì vậy, khi bạn chạy trang web lần đầu tiên, Page_Load của bạn tạo ra dữ liệu và mọi thứ đều tốt.

Nhưng khi bạn tải trang đó lần thứ hai hoặc nếu ai đó cố gắng tải trang của bạn, dữ liệu vẫn có ở đó vì nó tĩnh, vì vậy, bạn cố gắng thêm cột vào dữ liệu khi chúng đã tồn tại.

3 cách bạn có thể làm được việc này:
1. Remove và sau đó thêm các cột lại. Đừng bao giờ làm điều này, nó là dư thừa và mã xấu trong mọi khía cạnh.
2. Thêm câu lệnh if xung quanh dtp.Columns của bạn.Thêm để đảm bảo nó chỉ chạy chúng lần đầu tiên trang được tải. Bạn có thể kiểm tra xem các columnd có tồn tại hay không, bạn có thể tạo một cờ bool, hoặc cái khác có nghĩa là bạn nghĩ đến.
3. Xóa tĩnh khỏi khai báo biến để mỗi lần tải trang dữ liệu mới sẽ được tạo. Nếu bạn làm điều này thì có thể bạn muốn căn cứ vào datatable off của một nguồn dữ liệu tĩnh.

3

static trong ASP.NET (đa luồng) có nghĩa là cho tất cả các yêu cầu, vì vậy ngay cả một người dùng đang diễn ra trang này là sử dụng cùng một ví dụ của số DataTable. Đó là lý do.

Giải pháp là không làm cho nó tĩnh.

Bạn phải sử dụng một cách khác để duy trì nó qua các lần đăng lại (ví dụ: Phiên, ViewState, v.v.).

Nine Options for Managing Persistent User State in Your ASP.NET Application

Lưu ý: Tôi sẽ thậm chí không sử dụng nó như lĩnh vực nhưng như là một biến địa phương trong một phương thức trả về nó. Bằng cách này, bạn có thể sử dụng phương pháp này bất cứ nơi nào bạn cần dữ liệu đó. Thông thường, bạn liên kết nó với một điều khiển webdatabound như GridView trong đó duy trì giá trị của nó qua postback qua ViewState. Vì vậy, bạn không cần phải duy trì bản thân bảng.