在动态填充的CheckBoxList中预先选择项目

时间:2011-11-04 17:33:03

标签: asp.net vb.net controls initialization page-lifecycle

我一直在试验这个并试图理解几个小时的页面生命周期。在这一点上我完全难过:'(任何帮助都会非常感激。

以下是我的方法。我的_PrefillWizard方法实际上适用于我的页面上的所有控件,除了那些动态填充的控件。 CheckBoxList是这样的,因为它们是根据我的数据库中的表中的可选值自动生成的。我已经在我的标记中有这样的控件了...在运行其他代码之前如何强制加载并做好准备?

<asp:CheckBoxList ID="MyLanguagesCBL" runat="server" RepeatDirection="Vertical"
    RepeatColumns="4" Width="100%" DataSourceID="LanguagesSDS"
    DataTextField="Language" DataValueField="ID">
</asp:CheckBoxList>
<asp:SqlDataSource ID="LanguagesSDS" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ConnectionString1 %>"
    SelectCommand="select ID, [Language] from LanguagesListTable"
    DataSourceMode="DataReader">
</asp:SqlDataSource>

显然,在我的_PrefillWizard被调用之前,尚未生成这些特定控件或在页面上,导致没有预先填充任何CheckBox。 如何在调用prefill方法之前生成它们?谢谢;)

点击事件。

'On "Load" Button click, clears a Wizard control and Prefills it with the
'  data from the clicked record based on the primary key stored in SessionState.
Protected Sub RowClick(ByVal sender As Object, ByVal e As GridViewCommandEventArgs) Handles GridView2.RowCommand
    If e.CommandName = "Select" Then
        Session.Add("ClickedPrimaryKey", GridView2.DataKeys(e.CommandArgument).Value.ToString)
        'This is the main function which calls "_SetCheckBoxes" among others.
        _PrefillWizard(Session.Item("ClickedPrimaryKey"))
    End If
End Sub

这是我填充my CheckBoxList控件的功能,但显然取决于页面上已加载的控件。

'Parse a CSV String from the Database back into CheckBoxList Selections
Protected Sub _SetCheckBoxes(ByRef cbl As CheckBoxList, ByRef dt As DataTable, ByVal row As Integer, ByVal csv As String)
    'Do something if there is a value in the cell
    If Not IsDBNull(dt.Rows.Find(row)(csv)) Then
        For Each item As ListItem In cbl.Items
            item.Selected = False 'Reset the checkbox first
            'Then, if the ID value of the checkbox corresponds to a value 
            '  in the CSV string, then tick the checkbox.
            If csv.Contains(item.Value) Then
                item.Selected = True
            End If
        Next
    End If
End Sub

2 个答案:

答案 0 :(得分:0)

这是一个潜在的想法,也是我们之前在类似情况下使用过的想法:

因为在单击处理程序之前触发了Page Init事件,所以实际上可以检查Request.Form("__EventTarget"),如果是行单击,则将新的CheckBoxList添加到适当的容器(页面,选项卡等)。 / p>

如果要添加多个控件,则必须确保在页面中的某处跟踪添加的项目,以便每次触发Page Init时都可以自动重新创建它们。

答案 1 :(得分:0)

你们可能会对此感到兴奋,但答案是如此明显,以至于我这次都没有抓住它。当然,我也专注于大约10个其他功能&gt;。&lt;

这是答案。您会注意到,在我的_SetCheckBoxes方法中,我首先检查以确保特定csv字符串存在值,但是请注意,我之后未能将其实际设置为相应的值字符串。这并不是很明显,但我实际传入的csvDataTable中字符串实际存在的列的名称。

csv = dt.Rows.Find(row)(csv).ToString

在我的IsDBNull检查后立即添加该行,解决了我的问题。 :)