DBのさまざまなテーブルをデータテーブルにバインドし、データテーブルをグリッドビューに割り当てる動的グリッドビュー関数を作成しています!これがどのように機能するかです。ドロップダウンリスト、グリッドビュー、ボタンがあります。ボタンはドロップダウンリストの選択に基づいて特定の機能を起動し、グリッドビューはデータをバインドします。私の問題は、ボタンを初めて押すと、グリッドビューはDBからのデータをバインドし、2回押すと、グリッドビューは1回目のプレスのデータからデータを複製します。データの重複を避けるためにグリッドビューをクリアするにはどうすればよいですか?
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
申し訳ありませんが、これはC#ですが、新しいデータをバインドする前に呼び出すだけで、既存のデータがすべてクリアされます...もちろん、割り当てているデータソースに重複データがある場合を除きます。
gridview.DataSource=null;
gridview.DataBind();
また、そのプロシージャが呼び出されるたびにすべての列を追加していることに注意してください。実行する必要があります:
gridview.Columns.Clear();
たとえば、データソースをリセットして再バインドできます
gv.datasource=""
gv.databind()
そしてそれを再利用します
グリッドビューをid
のあるテーブルに配置します。
<table id="myTable" border="0">
<tr><td>
<asp:GridView Width="765px" ID="mygrid" runat="server">
...
...
</asp:GridView>
</td></tr></table>
次に、ボタンから呼び出して、JavaScript関数をクリックします。
function clearGridview()
{
var rows = document.getElementById('myTable').getElementsByTagName('tbody') [0].getElementsByTagName('tr').length;
if(rows!=0)
document.getElementById("myTable").deleteRow(0);
}
通常、次のようにグリッドを再バインドすると、これは発生しません。
grid.DataSource = 'NEW_DATA_SOURCE'
grid.DataBind
問題は、データをフェッチする関数にあると思います。
CreateDataTable(sSql)
毎回新しいDataTableにデータをフェッチする場合、または同じデータテーブルを使用する場合は、この内部を確認してください(グローバルスコープで宣言されるか、クラスからデータアクセスコンポーネントに渡される場合があります)。私はこれを修正するために一度一晩を失いました:(