2009-07-01 40 views
11

Tôi đang tạo ra một chức năng GridView động mà sẽ ràng buộc các bảng khác nhau từ DB vào một datatable và sau đó gán datatable cho GridView! Đây là cách nó hoạt động, tôi có một danh sách thả xuống, GridView và một nút, nút sẽ kích hoạt chức năng cụ thể dựa trên lựa chọn danh sách thả xuống và sau đó GridView sẽ ràng buộc dữ liệu, vấn đề của tôi là, khi bạn nhấn nút lần đầu tiên, GridView sẽ liên kết dữ liệu từ DB, lần thứ hai nhấn, GridView sẽ sao chép dữ liệu từ dữ liệu của lần đầu tiên nhấn! làm thế nào để tôi rõ ràng ra khỏi GridView để tránh trùng lặp dữ liệu?cách xóa chế độ xem lưới?

Private Sub Login() 
    sSql = "" & _ 
    "SELECT TYPE, SUBTYPE, LOGTS, ACTION, USERID, STAT1 " & _ 
    "FROM i_LOG " & _ 
    "WHERE TYPE = 'USR' AND SUBTYPE = 'LOG' " & _ 
    "AND CONVERT(VARCHAR(20), LOGTS, 103) >= '" & txtDTFrom.Text & _ 
    "' AND CONVERT(VARCHAR(20), LOGTS, 103) <= '" & txtDTTo.Text & "'" 

    DT = CreateDataTable(sSql)  'Retrieve from database. 

    Session(sSesDT) = DT 
    GVM.DataTable = DT 
    GVM.GVAddEmptyRow() 

    Dim seq As New BoundField 
    Dim Type As New BoundField 
    Dim SubType As New BoundField 
    Dim Logts As New BoundField 
    Dim action As New BoundField 
    Dim user As New BoundField 
    Dim status As New BoundField 

    seq.HeaderText = GVM.DTNumberField 
    seq.DataField = GVM.DTNumberField 

    Type.HeaderText = "Type" 
    Type.DataField = "TYPE" 

    SubType.HeaderText = "Subtype" 
    SubType.DataField = "SUBTYPE" 

    Logts.HeaderText = "Date and Time" 
    Logts.DataField = "LOGTS" 

    action.HeaderText = "Action" 
    action.DataField = "ACTION" 

    user.HeaderText = "User ID" 
    user.DataField = "USERID" 

    status.HeaderText = "Status" 
    status.DataField = "STAT1" 

    gv.AutoGenerateColumns = False 
    gv.Columns.Add(Type) 
    gv.Columns.Add(SubType) 
    gv.Columns.Add(Logts) 
    gv.Columns.Add(action) 
    gv.Columns.Add(user) 
    gv.Columns.Add(seq) 
    gv.Columns.Add(status) 

    gv.DataSource = Session(sSesDT) 
    gv.DataBind() 
End Sub 

Private Overloads Function CreateDataTable(ByVal sSql As String) As DataTable 
    Dim DA As New OleDb.OleDbDataAdapter 
    Dim dtDataTbl As New DataTable 
    Dim dcDataCol As New DataColumn 

    With DBMgr 
     .openCnn() 
     .SQL = sSql 
     .openRst() 
     DA.Fill(dtDataTbl, .rst) 
    End With 

    '==Adding Columns== 
    dcDataCol = New DataColumn 'No 
    With dcDataCol 
     .DataType = GetType(Int32) 
     .ColumnName = GVM.DTNumberField 
     .AutoIncrement = True 
     '.AllowDBNull = True 
    End With 
    dtDataTbl.Columns.Add(dcDataCol) 
    '**Adding Columns** 

    Return dtDataTbl 
End Function 
+0

đâu là bấm nút xử lý Mã số? – TheVillageIdiot

Trả lời

26

Xin lỗi, đây là trong C#, nhưng chỉ cần gọi nó trước khi bạn gắn bất kỳ dữ liệu mới và nó sẽ xóa tất cả các dữ liệu hiện có ... tất nhiên trừ khi vấn đề là DataSource bạn đang gán có nhân đôi dữ liệu.

gridview.DataSource=null; 
gridview.DataBind(); 

Ngoài ra, chỉ cần lưu ý, bạn thêm mỗi cột vào mỗi lần thủ tục được gọi? Bạn cần phải chạy:

gridview.Columns.Clear(); 
1

Bạn có thể đặt nó nguồn dữ liệu và rebind nó ví dụ

gv.datasource="" 
gv.databind() 

và sau đó tái sử dụng nó

+0

bạn không thể gán chuỗi trống vào lưới dữ liệu thu thập dữ liệu, vui lòng dùng thử. – Ramakrishnan

+1

Tôi đã thử ** chuỗi.Empty ** và đã làm việc –

0

Thông thường điều này không xảy ra khi bạn rebind lưới như:

grid.DataSource = 'NEW_DATA_SOURCE' 
grid.DataBind 

Tôi nghĩ có thể vấn đề nằm trong chức năng tìm nạp dữ liệu của bạn:

CreateDataTable(sSql) 

Vui lòng kiểm tra bên trong này nếu bạn đang tải dữ liệu mỗi lần vào cùng một DataTable hoặc sử dụng mới (có thể được khai báo ở phạm vi toàn cầu hoặc truyền từ lớp học của bạn để truy xuất dữ liệu thành phần). Tôi đã mất cả đêm một lần để sửa lỗi này Nơi :(

0

GridView của bạn trong một bảng với một id:

<table id="myTable" border="0"> 
<tr><td>            
<asp:GridView Width="765px" ID="mygrid" runat="server"> 
... 
... 
</asp:GridView> 

</td></tr></table> 

Sau đó gọi từ một nút bấm chức năng javascript của bạn:

function clearGridview() 
{ 
var rows = document.getElementById('myTable').getElementsByTagName('tbody') [0].getElementsByTagName('tr').length; 
if(rows!=0) 
    document.getElementById("myTable").deleteRow(0); 
} 
Các vấn đề liên quan