適切

2017-08-28 7 views
8

私はこのようなASPxGridViewのチェックボックス持っASPxGridViewないウォーキングでCheckBox.Checkedを取得:適切

<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

loadStatusをパラメータとして使用してチェックされた関数を呼び出しているので、チェックされたりチェックが外されたりすると、読み込み中のパラメータでローディング関数が呼び出されます – MaCron

+0

ケースを完全に理解しているかどうかはわかりませんが、 LoadPostData() 'がコードにありません。この行の直後に 'DevExpress.Web.ASPxEditors.ASPxCheckBox = ....'としてDim LoadingStatusを呼び出し、 'DirectCast(btSimpan、IPostBackDataHandler).LoadPostData(btSimpan.UniqueID、Request.Form) 'を呼び出してみてください。 btw私は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 

私はその変数を削除しました。

-EDIT-

私はセッションチェッカーを削除した場合には検索やソートに問題を抱えています。私はいくつかの記事を検索して、より良いフィットと検索/ ASPxGridViewの機能を並べ替えることで、まだ新しいソリューションを持っています。 INITでload_menu()関数を呼び出す

は、この場合のために最善の方法である:

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

あなたはこの場合のためにセッション変数を削除することができます。この解決策に問題がある場合は、コメントでお知らせしたり、新しい回答を投稿したりしてください。

ありがとうございました。