Как очистить gridview?

Я создаю динамическую функцию gridview, которая свяжет различные таблицы из DB в datatable, а затем назначит datatable gridview! Вот как это работает: у меня есть раскрывающийся список, gridview и кнопка, кнопка запускает определенную функцию на основе выбора dropdownlist, а затем gridview свяжет данные, моя проблема в том, что, когда u нажимают кнопку в первый раз, gridview свяжет данные из БД, второй раз нажав, gridview будет дублировать данные из данных первого нажатия! как очистить сетку, чтобы избежать дублирования данных?

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

Ответ 1

Извините, это на С#, но просто вызовите его, прежде чем связывать новые данные, и он очистит все существующие данные... если, конечно, проблема в том, что назначенный DataSource имеет дублированные данные.

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

Также, чтобы отметить, вы добавляете каждый столбец каждый раз, когда вызывается эта процедура? Вам нужно запустить:

gridview.Columns.Clear();

Ответ 2

Вы можете reset его источник данных и переустановить его, например

gv.datasource=""
gv.databind()

а затем повторно использовать его

Ответ 3

Обычно этого не происходит, когда вы перестраиваете сетку, например:

grid.DataSource = 'NEW_DATA_SOURCE'
grid.DataBind

Я думаю, может быть, проблема в том, что ваша функция извлекает данные:

 CreateDataTable(sSql)

Пожалуйста, проверьте это, если вы каждый раз извлекаете данные в новый DataTable или используете тот же самый (может быть объявлен в глобальной области или передан от вашего класса к компоненту доступа к данным). Однажды я потерял всю ночь, чтобы исправить это: (

Ответ 4

Поместите сетку в таблицу с помощью id:

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

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

Затем вызовите с помощью кнопки click your javascript function:

function clearGridview()
{
var rows = document.getElementById('myTable').getElementsByTagName('tbody')  [0].getElementsByTagName('tr').length;
if(rows!=0)
    document.getElementById("myTable").deleteRow(0);
}