格式化后,使用许多名称填充组合框

时间:2012-05-04 18:26:25

标签: c# string linq data-binding linq-to-entities

好的,我有一些看起来像这样的东西:

公司名称-1234

我只希望名称在组合框中供用户选择,因为在这种情况下不需要使用短划线后跟数字。

继承我的代码,用Linq查询数据库,然后删除破折号之后的所有内容,但它看起来似乎是用任何东西填充组合框。

            using (context ctx = new context())
            {
            List<companyinformation> compInf = new List<companyinformation>();

            var getCompanies = (from c in ctx.companyinformations
                               select c.name).ToList();

            foreach (var n in getCompanies)
            {
                compInf.Add(new companyinformation() { name = Remove(n.LastIndexOf('-')) });
            }

            cbModClient.DataSource = compInf;
            cbModClient.DisplayMember = "name";
            cbModClient.SelectedIndex = -1;
            };

我刚试过这段代码并且它工作正常,我认为是因为我这次使用了“ - ”而不是“ - ”。

        using (context ctx = new context())
        {
            List<companyinformation> compInf = new List<companyinformation>(ctx.companyinformations);

            var getCompanies = (from c in compInf
                       where c.name.Contains("-")
                       select c.name.Substring(0, c.name.LastIndexOf("-"))).ToList();

            cbModClient.DataSource = getCompanies;
            cbModClient.DisplayMember = "name";
            cbModClient.SelectedIndex = -1;
        };

2 个答案:

答案 0 :(得分:2)

您绑定到getCompanies结果集合,但您已执行字符串操作并将其添加到compInf

cbModClient.DataSource = compInf;

也许是一种较短的方式:

var companyNames = ctx.companyinformations
                      .Select(c=> new {FormattedName = 
                                 c.name.Substring(0,c.name.LastIndexOf('-'))
                                       .Trim()})
                      .ToList();

cbModClient.DataSource = companyNames;
cbModClient.DisplayMember = "FormattedName";
cbModClient.ValueMember = "FormattedName";

考虑在DataSource赋值上放置一个断点,并检查/确保您的变量确实具有您期望的值。这将决定您的问题是否与LINQ相关,或与数据绑定相关。

答案 1 :(得分:0)

我无法复制“仍然没有项目出现”问题。这是一个有效的等效程序。

假设您确实从数据库中获得了结果并且没有抛出任何异常,剩下的问题是:您的ComboBox有何不同?

using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

class Form1 : Form
{
    class CompanyInfo
    {
        public string Name { get; set; }
    }

    static string RemoveTrailingDash(string value)
    {
        int dashIndex = value.LastIndexOf('-');
        if (dashIndex > 0)
            return value.Substring(0, dashIndex).TrimEnd();
        return value;
    }

    public Form1()
    {
        var companies = new CompanyInfo[]
        {
            new CompanyInfo { Name = "Ajax - 1200" },
            new CompanyInfo { Name = "Bermuda Corp - 1" },
            new CompanyInfo { Name = "Capitol Inc" },
            new CompanyInfo { Name = "Dash LLC - " },
        };

        Controls.Add(new ComboBox
        {
            Location = new Point(10, 10),
            DropDownStyle = ComboBoxStyle.DropDownList,

            DataSource = companies.Select(c => new { FormattedName = RemoveTrailingDash(c.Name) }).ToList(),
            DisplayMember = "FormattedName",
        });
    }
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}