2017-08-28 27 views
8

我复选框在ASPxGridView这样的:获取CheckBox.Checked在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 

ADDED

在这里,我如何绑定数据:

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 

我在这里错过了什么?任何帮助将被认可。谢谢。

+0

如何以及何时将数据绑定到GridView?如果您未将数据绑定包装在“IsPostBack”检查中,每次发生PostBack时,复选框的状态将被其数据库值覆盖。 – VDWWD

+0

您也正在使用loadingStatus作为参数调用您的checked函数,所以无论何时它被选中或取消选中,它都会使用加载参数调用加载函数 – MaCron

+0

不太确定我是否完全理解该案例,但我认为这可能是' LoadPostData()'在代码中缺少。尝试在这行之后调用'DirectCast(btSimpan,IPostBackDataHandler).LoadPostData(btSimpan.UniqueID,Request.Form)'Dim loadingStatus As DevExpress.Web.ASPxEditors.ASPxCheckBox = ....'并参阅。顺便说一句,我没有真正进入VB.NET,所以我将我的C#代码片段转换为这一片。原来在C#中是((IPostBackDataHandler)btSimpan).LoadPostData(btSimpan.UniqueID,Request.Form);'。希望能帮助到你..如果是这样,请告诉我,我明天会发布完整答案。祝你好运:) –

回答

2

对不起,

这是会话绑定问题,检查是否会话中使用,那么数据源将用绑定。代码是:

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 

我删除该变量,并且现在一切正常。

CNC中

它有搜索,如果我删除了会话检查排序问题。我有新的解决方案,通过搜索一些更合适的文章,并且ASPxGridView中的搜索/排序功能仍在工作。

调用到了init load_menu()功能,对于这种情况最好的办法:

Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init 
    Call Load_menu() 
End Sub 

您可以删除会话变量这种情况。如果此解决方案存在问题,请通过评论或发布新答案告诉我。

非常感谢您的帮助。