2016-08-01 12 views
3

私はGridViewにチェックボックスの列があります。ボタンをクリックすると、チェックボックスをオンにしたすべての行が削除されます。私は何とか奇妙でハッキリな解決策に遭遇しました。なぜそれが機能するのかわかりません。私はすでに関連するSOの質問を既に検索しました。ポストバック時にASP.NET CheckBoxが異常なハックなしでチェックされていない

関連コード:

Protected Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Init 
    ' I have no idea why this is needed for the checkboxes to work... 
    Dim x = imageGridView.Rows 
End Sub 


Protected Sub RemoveButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles removeButton.Click 

    For Each row As GridViewRow In imageGridView.Rows 
     Dim selectCheckBox As CheckBox = DirectCast(row.Cells(0).FindControl("selectCheckBox"), CheckBox) 
     If selectCheckBox.Checked Then 
      Dim fileName As String = row.Cells(1).Text 
      ImageList.Remove(ImageList.FindLast(Function(r) r.FileName = fileName)) 
     End If 
    Next 
    imageGridView.DataSource = ImageList 
    imageGridView.DataBind() 
End Sub 

ASPX:

<asp:GridView ID="imageGridView" runat="server"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:CheckBox ID="selectCheckBox" runat="server" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Dim x = imageGridView.Rowsを除去する行のために必要とされます。 Page_InitのサブコードにRemoveButton_Clickコードを入れてから、コードが削除されてしまいました。 Dim x = imageGridViewで十分ではなく、同じことをPage_Loadで行うことはできません。

私のチェックボックスは無効になることはありません。

私はコードが正常に動作するために、Page_InitimageGridView.Rowsを参照する必要があるのはなぜですか?

+0

完全なポストバックを行っているか、更新パネルを使用していますか? –

+0

私は、 'addButton'がトリガーする' UpdatePanel'を持っていますが、グリッドはパネル内に含まれていません。 – mbomb007

答えて

1

これは興味深い動作です。すべてのポストバックでPage_LoadのGridViewにデータをバインドすると問題が再現されます。そのような状況では、チェックボックスはポストバック時に選択状態を失いますが、imageGridView.RowsPage_Initに記載している場合は表示されません。

溶液をIf Not IsPostBack条件ブロック内のデータを結合することである。その場合

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not IsPostBack Then 
     imageGridView.DataSource = ImageList 
     imageGridView.DataBind() 
    End If 
End Sub 

、しかし、我々はPage_InitimageGridView.Rowsを参照してはなりません。そうすると、チェックボックスの選択状態(!?!)が失われます。

のGridView(this sourceが信頼できると仮定して)のソースコードから、私はRowsコレクションにアクセスするその後CreateChildControlsを呼び出しEnsureChildControlsへの呼び出しをトリガすることに気づきます。私はその時点で何が起こるかを知るために.NETコードに入ることはできませんでした。 Page_Initイベントハンドラでこれらのメソッドを呼び出すと、life cycle of the GridViewに予期されているより早く到着することがあります。

ちなみにHeaderRowFooterRowのプロパティにアクセスすると、EnsureChildControlsが呼び出され、チェックボックスの選択状態にも同じ影響があります。

+0

私は、ポストバックごとにデータを再バインドしなければならないと思った、またはそれ以上は持ち越さないだろうが、明らかにそうではない。ありがとう! – mbomb007

関連する問題