5

DropDownListを含むFormViewを含むUserControlがあります。FormViewはデータコントロールにバインドされています。

そのようです:

<asp:FormView ID="frmEdit" DataKeyNames="MetricCode" runat="server" DefaultMode="Edit" DataSourceID="llbDataSource" Cellpadding="0" >
    <EditItemTemplate>
        <asp:DropDownList ID="ParentMetricCode"  runat="server" SelectedValue='<%# Bind("ParentMetricCode") %>' />
    </EditItemTemplate>
<asp:FormView>

コードビハインドからDropDownListにデータを入力しようとしています。これがFormViewに含まれていなかった場合、通常はPage_Loadイベントで行います。ただし、FormView内では機能しません。コードでドロップダウンリストにアクセスして、実行しようとするとすぐに、次のようになります。

theListcontrol = CType(formView.FindControl(listControlName), ListControl)  

... FormViewのデータバインディングメカニズムが呼び出されます。これはもちろん、DropDownListを基になるデータソースにバインドしようとします。これにより、**'ParentMetricCode'のSelectedValueが無効になります。これは、アイテム。DropDownListがまだ入力されていないため、「パラメーター名:値...」エラー。

FormViewのDataBinding()イベントでロードを実行しようとしましたが、次のようになりました。

theListcontrol = CType(formView.FindControl(listControlName), System.Web.UI.WebControls.ListControl)

...その時点でFormView.Controls.Count=0であるため、失敗します。

これは不可能ですか?(ドロップダウンリストをバインドするためにセカンダリObjectDataSourceを使用する必要はありません)

4

3 に答える 3

4

OnDataBindingに直接実装しますDropDownList

フォームビューをいくつかのデータにバインドすると、OnDataBindingforが起動しますDropDownList。この時点で、必要な値をリストにロードし、選択した値をロードされたリストにバインドすることもできます。

次に例を示します。

<asp:DropDownList ID="ParentMetricCode"  runat="server" OnDataBinding="ParentMetricCode_DataBinding" />

次に、OnDataBindingを実装します。

protected void ParentMetricCode_DataBinding(object sender, System.EventArgs e)
{            
    DropDownList ddl = (DropDownList)(sender);

    // Fill the list items however you want
    ddl.Items.Add(new ListItem("1", "1"));
    ddl.Items.Add(new ListItem("2", "2"));
    // etc...

    // Set the selected value
    ddl.SelectedValue = Eval("ParentMetricCode").ToString();
}

DataBindFormViewを使用すると、すべてが魔法のようになり始めます:)

またDropDownList、DBなどからリストデータをロードする場合は、データの各「行」によってリストデータがロードされるため、キャッシュする必要があります。

編集: あなたはそれが不可能だと思うので、私はそれがどのように機能するかを証明するために簡単なデモアプリを書きました:

aspxファイルにこれを含めます:

<asp:FormView ID="fvTest" runat="server">
    <ItemTemplate>
        <asp:DropDownList ID="ddlTest" runat="server" OnDataBinding="ddlTest_DataBinding"></asp:DropDownList>
    </ItemTemplate>
</asp:FormView>

次に、.csファイルで:

public class MockData
{
    public string ID { get; set; }
    public string Text { get; set; }
}

protected void Page_Load(object sender, EventArgs e)
{
    List<MockData> lst = new List<MockData>();
    lst.Add(new MockData() { ID = "3", Text = "Test3" });
    fvTest.DataSource = lst;
    fvTest.DataBind();
}

protected void ddlTest_DataBinding(object sender, System.EventArgs e)
{
    DropDownList ddl = (DropDownList)(sender);
    ddl.Items.Add("1");
    ddl.Items.Add("2");
    ddl.Items.Add("3");
    ddl.Items.Add("4");
    ddl.Items.Add("5");

    ddl.SelectedValue = Eval("ID").ToString();
 }

コードを実行します...DropDownListすべての値がロードされ、モックオブジェクトに設定された正しい選択値に設定されます。

それをより良く証明するために他に何ができるかわかりません...DataBindingが実際にどのように機能するかが欠けていると思います。レベルでそれを行おうとすると、実際にバインドさFormViewれるまでコントロールは作成されません。FormViewバインディングが発生すると、テンプレート内の各コントロールをトリガーして、そのイベントを実装することで何かを実行できますOnDataBinding。その時点で、バインドされたオブジェクトの現在の反復とその値が使用可能になり、ここで私のコードがを実行しEval("ID")ます。

于 2010-03-12T19:38:25.113 に答える
2

コントロールが作成される前に発生するOnDataBindingではなく、OnDataBoundイベントで機能しています。

<asp:DropDownList ID="ddlCountry" runat="server" DataSourceID="SqlDataSrcCountries" AutoPostBack="True" DataTextField="name" DataValueField="code" OnDataBound="ddlCountry_DataBound">
</asp:DropDownList>

コードビハインド:

Protected Sub ddlCountry_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)

    Dim ddlCountry As New DropDownList
    Dim strCountry As String = String.Empty
    Dim lstItemToFind As New ListItem

    ddlCountry = FormViewUsers.FindControl("ddlCountry")
    strCountry = Eval("country")
    lstItemToFind = ddlCountry.Items.FindByValue(strCountry)

    If (Not IsNothing(lstItemToFind)) Then
        ddlCountry.SelectedValue = strCountry
    End If

End Sub

編集以外のテンプレートでこれを使用する場合は、以下を検証する必要があります。

    If (FormViewUsers.CurrentMode = FormViewMode.Edit) Then

    End If
于 2011-05-30T20:05:28.420 に答える
1

わかりました。「a」ソリューションが見つかりました。1 。イベント
からDDLポピュレート関数を呼び出します。 2.次のようにコードを変更してDDLを設定します。FormView_ItemCreated

Public Overloads Shared Sub BindListControl(Of theLLBLgenEntityType As EntityBase) _   
        (ByVal formView As FormView, _
        ByVal listControlName As String, _
        ByVal theCollection As CollectionCore(Of theLLBLgenEntityType), _
        ByVal DataValueField As EntityField, _
        ByVal DataTextField As EntityField, _
        ByVal IncludeEmptyItem As Boolean)

    If formView.CurrentMode = FormViewMode.Edit Then
        Dim theListcontrol As System.Web.UI.WebControls.ListControl
        theListcontrol = CType(formView.FindControl(listControlName), System.Web.UI.WebControls.ListControl)

    For Each entity As theLLBLgenEntityType In theCollection
        theListcontrol.Items.Add(New ListItem(entity.Fields(DataTextField.Name).CurrentValue.ToString, entity.Fields(DataValueField.Name).CurrentValue.ToString))
    Next

    If IncludeEmptyItem Then 
        theListcontrol.Items.Insert(0, New ListItem("", ""))
    End If
End Sub

基本的には、 FormView内で、実行時にプログラムで追加の「データバインディング」を実行することはできません。

(なぜ私のコードのフォーマットがこの投稿ですべて台無しになっているのか誰もが知っていますか??)

アップデート

このソリューションでは、新しいアイテムの挿入に関連して、さらに別の問題が発生します。何度もねじ込んだ後、私は最終的にそれを回避する方法を見つけました。この時点で、私は基本的に、FormViewコントロールを完全に回避するか、プログラムでバインドされたコントロールを変更することを絶対に回避することをお勧めします。うまくいけば、DropDownListごとに別々のデータコントロールを使用する方がうまくいくかもしれませんが、これも希望的観測かもしれません。

于 2010-03-12T20:45:21.460 に答える