我可以使用什么最舒适的数据类型来填充DropDownList?

时间:2010-08-21 15:22:16

标签: c# asp.net webforms drop-down-menu

例如,我希望用户为给定的团队创建一个新的粉丝俱乐部。

显然,必须将团队加载到DropDownList中,以便从预先设定的选择组中选择它们。团队列表从数据库返回。

截至目前,我正在做这样的事情:

//FindAll() returns IQueryable<Team>
var Teams = teamsRepo.FindAll().AsEnumarable();
myDropDownList.DataTextField = "Name";
myDropDownList.DataValueField = "ID";
myDropDownList.DataSource = Teams;
myDropDownList.DataBind();

不幸的是,当这样做时,我没有强类型属性,因此存在拼写错误拼写ValueField或TextField的风险。

尝试获取DropDownList的选定值时也存在问题。使用以下代码,无论选择哪个团队,所有内容都将以ID 1保存。

fansite.IDTeam = myDropDownList.SelectedIndex;

有关如何改进的任何建议?

4 个答案:

答案 0 :(得分:2)

从您的问题看来,您似乎关心代码中数据绑定的硬编码字符串。同样的事情也让我疯狂。

有一种使用lambda方法和表达式树的好方法,它可以让你摆脱硬编码的字符串并以强类型的方式获取属性名称:

您可以使用此类和扩展方法...

public class Nameof<T>
{
    public static string Property<TProp>(Expression<Func<T, TProp>> expression)
    {
        var body = expression.Body as MemberExpression;
        if(body == null)
            throw new ArgumentException("'expression' should be a member expression");
        return body.Member.Name;
    }
}

...这将允许您执行以下操作:

//instead of myDropDownList.DataTextField = "Name";
myDropDownList.DataTextField = Nameof<Team>.Property(t => t.Name);
//instead of myDropDownList.DataValueField = "ID";
myDropDownList.DataValueField = Nameof<Team>.Property(t => t.ID);

这就是我喜欢看到的;看不到硬编码的字符串文字! : - )

答案 1 :(得分:1)

(这是在ASP.Net澄清之前写的,我已经从一个winforms人员那里回答了。)

我不确定您的Teams ID是什么样的,但如果它们不是顺序的,零基础且没有间隙,使用myDropDownList.SelectedIndex;会给您错误的数据。

我认为你最后一行应该是:

fansite.IDTeam = myDropDownList.SelectedValue;

在要使用的数据类型上,我通常使用Dictionary<int, string>作为下拉列表,并使用一些辅助扩展方法来使人口更好。

答案 2 :(得分:1)

这正是.NET数据绑定的工作方式,您必须输入属性名称。

您始终可以将转换器添加到组合框项目,然后调用add(ms-doc

获取所选项目的值时,请尝试以下操作:

fansite.IDTeam = myDropDownList.SelectedValue;

答案 3 :(得分:0)

您应该考虑使用ObjectDataSourceLinqDataSource之类的DataSource来控制DataBind。

它可以节省您的时间并且不易出错,因为您将通过向导配置设置,而不是在代码隐藏中定义它们。