【问题标题】:Formview - Check if value is in databound listFormview - 检查值是否在数据绑定列表中
【发布时间】:2012-10-11 21:45:00
【问题描述】:

我的 FormView(学生)有一个 ObjectDataSource,FormView 中的 DropDownList(名称)有另一个 ObjectDatSource。如果 DropDownList 的源不包含与 formview 的源匹配的名称值,我想显示“不可用”。目前我有这个代码,如果数据源返回一个 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>

【问题讨论】:

  • 我正在使用一个数据库,使用我的示例,Student 表有很多过去的错误条目,这需要我很长时间才能返回并修复/正确绑定到名称桌子。姓名表是新的,并且有准确的学生姓名的良好列表。因此,gridview 中的此检查将捕获 Student 表中的任何条目,其中输入的名称可能带有额外的空格等,与 Names 表不匹配。对不起,如果这仍然令人困惑......
  • 我通常不使用数据源控件。我倾向于创建从数据库构建的自定义对象,并在代码中处理。我知道如果您是这样设置的,您实际上可以只查询对象集合(数据库结果集)并将它们与下拉列表的项目集合匹配并相应地操作它们。它的代码多一点,但 imo 更灵活。
  • 我是 ASP.NET 新手。你能给我举个例子来说明如何做到这一点吗?

标签: asp.net gridview drop-down-menu objectdatasource formview


【解决方案1】:
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") %>

我在这里实际做的是将控件绑定到实际对象列表,而不是使用数据源控件构造的数据表。通过这样做,我可以在将它们绑定到控件之前对这些列表做任何我需要做的事情。在这种情况下,我将两个列表碰撞在一起,并为那些不存在于一个列表中但存在于另一个列表中的项目添加项目。不确定这是否正是您所需要的,但这应该足以给您一些想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 2019-11-20
    • 2015-08-25
    • 1970-01-01
    • 2012-05-29
    • 2012-01-26
    • 2021-06-26
    • 2023-03-11
    相关资源
    最近更新 更多