【发布时间】:2017-08-28 10:02:37
【问题描述】:
我在 ASPxGridView 中有这样的复选框:
<dxwgv:ASPxGridView ID="Grid_Loading_Plan_Detail" runat="server" >
...
<dxwgv:GridViewDataColumn Caption="#" VisibleIndex="1">
<DataItemTemplate>
<dxe:ASPxCheckBox ID="loadingStatus" runat="server" Checked='<%# GetChecked(Eval("loadingStatus").ToString()) %>'></dxe:ASPxCheckBox>
</DataItemTemplate>
</dxwgv:GridViewDataColumn>
...
</dxwgv:ASPxGridView>
当复选框加载时它很好地绑定,这里是函数:
Public Function GetChecked(value As String) As Boolean
Select Case value
Case "1"
Return True
Case "0"
Return False
Case Else
Return False
End Select
End Function
问题是,当检查checked 状态时,它总是返回加载的值。如果第一次加载时状态为checked,然后我执行unchecked CheckBox,它仍然返回checked。这里我如何获取值并将其保存到数据库:
Protected Sub btSimpan_Click(sender As Object, e As EventArgs) Handles btSimpan.Click
Try
sqlstring = ""
For i As Integer = 0 To Grid_Loading_Plan_Detail.VisibleRowCount - 1
Dim loadingStatus As DevExpress.Web.ASPxEditors.ASPxCheckBox = Grid_Loading_Plan_Detail.FindRowCellTemplateControl(i, Grid_Loading_Plan_Detail.Columns(1), "loadingStatus")
sqlstring = sqlstring & " UPDATE containerTransaction SET loadingStatus = '" & IIf(loadingStatus.Checked, "1", "0") & "' " & _
" WHERE ID = '" & Grid_Loading_Plan_Detail.GetRowValues(i, "ID") & "'; "
Next
If SQLExecuteNonQuery(sqlstring) > 0 Then
Response.Redirect("loading-plan.aspx")
End If
Catch ex As Exception
Response.Write("Error btSimpan_Click <BR> " & ex.ToString)
End Try
End Sub
添加
我如何绑定数据:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try
If Not Page.IsPostBack Then
Call Load_menu()
End If
Catch ex As Exception
Response.Write("Page_Load Exception :<br>" & ex.ToString)
End Try
If Not Session("Grid_Loading_Plan_Detail") Is Nothing Then
Grid_Loading_Plan_Detail.DataSource = CType(Session("Grid_Loading_Plan_Detail"), DataTable)
Grid_Loading_Plan_Detail.DataBind()
End If
End Sub
这里是Load_menu() 函数:
Private Sub Load_menu()
Try
sqlstring = "SELECT ID, code, date, container, seal, sender, receiver, [weight], loadingStatus " & _
"FROM containerTransaction " & _
"WHERE loadingCode = (SELECT TOP 1 code FROM loadingPlan WHERE ID = '" & ID & "') AND [status] = 1 " & _
"ORDER BY [weight] "
DS = SQLExecuteQuery(sqlstring)
DT = DS.Tables(0)
Session("Grid_Loading_Plan_Detail") = DT
Grid_Loading_Plan_Detail.DataSource = DT
Grid_Loading_Plan_Detail.KeyFieldName = "ID"
Grid_Loading_Plan_Detail.DataBind()
Catch ex As Exception
Response.Write("Load_Menu Exception :<br>" & ex.ToString)
End Try
End Sub
我在这里错过了什么?
【问题讨论】:
-
如何以及何时将数据绑定到 GridView?如果您没有将数据绑定包装在
IsPostBack检查中,则复选框的状态将在每次 PostBack 发生时被其数据库值覆盖。 -
您还使用 loadingStatus 作为参数调用您的检查函数,因此无论何时检查或取消检查它都会使用加载参数调用加载函数
-
不太确定我是否完全理解此案,但我认为这可能是您的代码中缺少
LoadPostData()的问题。尝试在此行Dim loadingStatus As DevExpress.Web.ASPxEditors.ASPxCheckBox =....之后立即致电DirectCast(btSimpan, IPostBackDataHandler).LoadPostData(btSimpan.UniqueID, Request.Form)并查看。顺便说一句,我并没有真正进入 VB.NET,所以我将我的 C# sn-p 转换为这篇文章。 C# 中的原文是((IPostBackDataHandler)btSimpan).LoadPostData(btSimpan.UniqueID, Request.Form);。希望它有所帮助.. 如果是这样,请告诉我,我将在明天发布完整的答案。祝你好运:) -
@VDWWD :我添加了有问题的功能,谢谢。
-
@MaCron :您还有其他解决方案可以从数据库中绑定它吗?谢谢
标签: asp.net aspxgridview