0

linqを使用してデータベースから入力された配列からデータがバインドされるときに値が選択されるドロップダウンを備えたリピーターを設定しようとしています。

私が抱えている問題は、各ドロップダウンリストがレンダリング時に同じ選択された値を持っていることです。これは、配列内の最後の値でもあります。選択した各値は、前回の送信のテーブルに保存されているラベルに対応する必要があります。

func.ConfigurePastClientSetting(label.Text、krmid)は、過去のフォーム送信からデータベースに保存されたddl内の値の1つに等しい値を返します。

Private Sub rptDropDownInfo_ItemDataBound(sender As Object, 
                e As System.Web.UI.WebControls.RepeaterItemEventArgs) _
                Handles rptDropDownInfo.ItemDataBound
Dim selected As New List(Of String)
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
        Dim ddl As DropDownList = e.Item.FindControl("ddlEloquaValues")
        Dim column As EbmsColumnLabel = DirectCast(e.Item.DataItem, EbmsColumnLabel)
        ddl.Items.AddRange(ddlELQ.Items.OfType(Of ListItem)().ToArray())
        ddl.ClearSelection()
        ddl.Items.FindByValue(func.ConfigurePastClientSetting(column.displayname, krmid)).Selected = True
selected.Add(ddl.SelectedItem.Value)
    End If
End Sub

ddl.ClearSelectionを削除すると、「ドロップダウンリストエラーで複数の選択された値を持つことはできません。マークアップは次のようになります。

 <asp:Repeater ID="rptDropDownInfo" runat="server">
                <HeaderTemplate><table><tr><td style="width:60px;padding-left:20px;">KRM</td><td></td><td>Eloqua</td></tr></table></HeaderTemplate>
                <ItemTemplate>
                <tr>
                    <asp:Label ID="lblColumnNames" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "DisplayName") %>'></asp:Label><td>map to</td>
                        <asp:DropDownList ID="ddlEloquaValues" runat="server">
                        </asp:DropDownList>
                    <td>
                        <asp:Label ID="lblWarningLabels" runat="server" Text=""></asp:Label></td></tr>
                </ItemTemplate>
                </asp:Repeater>

first(0)ddl.SelectedValueをチェックしようとすると、配列の最後の項目が取得されます。

Private Sub Page_PreRender(sender As Object, e As System.EventArgs) Handles Me.PreRender
    If IsPostBack Then
        Dim ddl As DropDownList = rptDropDownInfo.Items(0).FindControl("ddlEloquaValues")
        Dim check = ddl.SelectedItem.Value
    End If
End Sub
4

1 に答える 1

0

すべてのDDLが同じListItemsインスタンスを共有しているようです。

したがって、アイテムにSelected = trueを設定すると、そのアイテムを共有するすべてのDDLに対してそのアイテムが選択されます。ClearSelectionを削除するときに問題が発生するのもそのためです

たとえば、既存のListItemを返すのではなく、Selectを介してLinqクエリで新しいListItemをインスタンス化することにより、新しいListItemを作成する必要があります)

これがお役に立てば幸いです。

ddl.Items.AddRange(ddlELQ.Items.OfType(Of ListItem)().ToArray())
ddl.Items.FindByValue(func.ConfigurePastClientSetting(column.displayname, krmid)).Selected = True

selected.Add(ddl.SelectedItem.Value)

(申し訳ありませんが、C#構文)である必要があります:

ddl.Items.AddRange(ddlELQ.OfType<ListItem>().Select(li=>new ListItem(){Text = li.Text,Value = li.Value}).ToArray())
ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(func.ConfigurePastClientSetting(column.displayname, krmid)));

また、マルチバインディングを防止する場合は、ClearSelection()を削除し、ddl.Items.Clear()に置き換える必要があります。

于 2012-09-26T09:31:16.343 に答える