0

FormView(Students)用のObjectDataSourceと、FormView内のDropDownList(Name)用の別のObjectDatSourceがあります。DropDownListのソースに、フォームビューのソースと一致する名前の値が含まれていない場合は、「使用不可」と表示したいと思います。現在、このコードがあります。これは、データソースがNULL値を返した場合に機能します。FormView名の値がDropDownListのデータバインドリストにない場合に「使用不可」を表示するようにこれを変更するにはどうすればよいですか?

<asp:FormView ID="Students" runat="server" DataSourceID="Students_DataSource">
    <ItemTemplate>
        <asp:Label ID="lblName" runat="server" Text='<%# Eval("Name") %>' />
    </ItemTemplate>
    <EditTemplate>
        <asp:DropDownList ID="ddlName" runat="server" 
        SelectedValue='<%# If(Eval("Name") IsNot Nothing, Eval("Name"), "Not Available") %>' 
                    DataSourceID="fvAllNames" runat="server" DataTextField="Name" DataValueField="Name" />        
    </EditTemplate>
</asp:FormView>
4

1 に答える 1

0
public class MyItem
{
    public string Name { get; set; }
    public int UserId { get; set; }
}

public void MethodThatLoadsMyData
{
    var originalListData = MethodThatFetchesMyData(45);
    myDropDownList.DataSource = MethodThatBumpsTwoItemDatasources(myOuterList, originalListData);
    myDropDownList.DataBind();
}

public void MethodThatBumpsTwoItemDatasources(List<MyItem> outerList, List<MyItem> dropdownList)
{
    /*This modifies the original result set from the database that you were going
    to use to populate your dropdown list. It compares the outer list (whatever that is)
    with the result set, and adds items called "Not Available" when there is an item in the
    outer list that doesn't exist in the dropdownlist */

    var result = new List<Item>();
    foreach (var item in listA)
    {
        var matched = false;
        foreach (var itemB in listB.Where(itemB => itemB.Id == item.Id))
        {
            matched = true;
            result.Add(item);
        }
        if (!matched)
        {
            result.Add(new Item
            {
                Name = "Not Available",
                Id = 0
            });
        }
        matched = false; 
    }
    return result;
}

public List<MyItem> MethodThatFetchesMyData(int myParameter)
{
    //gets my data from the database and builds dto objects
    var sql = "my_stored_procedure_or_sql";
    var list = new List<MyItems>();
    using(var conn = new SqlConnection(myConnectionString))
    {
        using(var comm = new SqlCommand(sql, conn))
        {
            //do your normal client setup here (sql type, parameters, etc//
            var parameters = SqlParameter[1];
            parameters[0] = new SqlParameter("@ParameterName", DbType.Int);
            parameters[0].Value = myParameter;
            comm.Parameters = parameters;
            comm.CommandType = CommandType.StoredProcedure;
            conn.Open();
            using(var rdr = comm.ExecuteReader())
            {
                while(rdr.Read())
                {
                    list.Add(
                        new MyItem{
                            Name = rdr["NameColumn"].ToString(),
                            UserId = rdr["ID"]
                        });
                }
                return list;
            }
        }
    }
}

データバインドされたコントロールでは、通常のアイテムテンプレートで新しい値を取得できます

<%#Eval("Name") %> <%#Eval("UserId") %>

ここで実際に行っているのは、データソースコントロールで構築されたデータテーブルではなく、実際のオブジェクトのリストにコントロールをバインドすることです。そうすることで、コントロールにバインドする前に、これらのリストで必要なことをすべて実行できます。この場合、2つのリストをまとめて、一方のリストには存在しないがもう一方のリストには存在するアイテムのアイテムを追加します。これがまさにあなたが必要としていたものであるかどうかはわかりませんが、これはあなたにいくつかのアイデアを与えるのに十分なはずです。

于 2012-10-12T17:14:33.877 に答える