C# 更改看似无关的代码会打断组合框。使其显示对象名称而不是值列表

C# 更改看似无关的代码会打断组合框。使其显示对象名称而不是值列表,c#,winforms,combobox,C#,Winforms,Combobox,我有一个C#.net winforms应用程序,它首先使用实体框架代码连接到SQL DB 我的一个组合框丢失了它应该从枚举中提取的值列表(12个月的列表),它只显示了月份列表对象的名称 这是因为我更改了与组合完全无关的代码,并且不应该影响它(将一些不相关的代码移动到另一个类),这似乎导致了上述问题。以前,当我添加一些新代码时,也发生了类似的事情,这导致了同样的事情发生。当某个值为null时,在我更改linq查询以返回“TBC”字符串之后,它最终修复了自身。记住,更改的代码与所讨论的组合框无关。在

我有一个C#.net winforms应用程序,它首先使用实体框架代码连接到SQL DB

我的一个组合框丢失了它应该从枚举中提取的值列表(12个月的列表),它只显示了月份列表对象的名称

这是因为我更改了与组合完全无关的代码,并且不应该影响它(将一些不相关的代码移动到另一个类),这似乎导致了上述问题。以前,当我添加一些新代码时,也发生了类似的事情,这导致了同样的事情发生。当某个值为null时,在我更改linq查询以返回“TBC”字符串之后,它最终修复了自身。记住,更改的代码与所讨论的组合框无关。在任何不相关的代码运行之前,也会填充组合

这是填充组合的代码:

private void UpdateMonthCombo()
{
    ArrayList AL = new ArrayList();
    foreach (string cs in Enum.GetNames(typeof(MonthsEnum)))
    {
        MonthList aEnum = new MonthList((int) Enum.Parse(typeof(MonthsEnum), cs), cs);
        AL.Add(aEnum);
    }

    BindingSource source = new BindingSource();
    source.DataSource = AL;
    comboMonth.ValueMember = "_MonthNumber";
    comboMonth.DisplayMember = "_Name";
    comboMonth.DataSource = source;
    comboMonth.SelectedItem = null;
}
我很想知道这是如何发生的,以及如何修复和预防它。我相信你能看出我对C#比较陌生

非常感谢您的帮助

这是一个月班:

public class MonthList
{

    public string _Name { get; set; }
    public int _MonthNumber { get; set; }

    public MonthList(int MonthNumber, string Name)
    {
        _Name = Name;
        _MonthNumber = MonthNumber;
    }
    public enum MonthsEnum : int
    {
        January = 1,
        February = 2,
        March = 3,
        April = 4,
        May = 5,
        June = 6,
        July = 7,
        August = 8,
        September = 9,
        October = 10,
        November = 11,
        December = 12
    }       
}
尝试使用此函数而不是枚举。按预期在单独的模板工程上进行测试。但在我的表单上,它只显示月份编号:

private void UpdateMonthCombo()
    {
        var monthList = CultureInfo.InvariantCulture.DateTimeFormat.MonthNames.Select((item, index) => new
        {
            Month = item,
            Value = index + 1
        });

        var result = monthList.Where(m => m.Month != "");

        comboMonth.DataSource = result.ToList();
        comboMonth.ValueMember = "Value";
        comboMonth.DisplayMember = "Month";
    }
private void AddProjectCombo()
    {
        gridBusinessKMs.Columns["Project"].Visible = false;
        DataGridViewComboBoxColumn cmbCol = new DataGridViewComboBoxColumn();

        cmbCol.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
        cmbCol.HeaderText = "Project";
        cmbCol.Name = "Project ";
        cmbCol.Items.Add("True");

        using (var context = new MileageLogDBContext())
        {
            cmbCol.DataSource = (from p in context.Projects
                                 orderby p.ProjectDescription
                                 select p.ProjectDescription).ToList();
        }
        gridBusinessKMs.Columns.Add(cmbCol);
        gridBusinessKMs.Columns["Project "].DisplayIndex = 1;
    }
我重构了组合框上的selectedindexchanged事件。它修复了组合框。但是现在主gridview被破坏了。它似乎与添加组合框列的方法有关。当我注释掉这个方法时,gridview会显示所有列(没有组合列),但原来的comboMonth会再次中断,只显示月份编号:

private void UpdateMonthCombo()
    {
        var monthList = CultureInfo.InvariantCulture.DateTimeFormat.MonthNames.Select((item, index) => new
        {
            Month = item,
            Value = index + 1
        });

        var result = monthList.Where(m => m.Month != "");

        comboMonth.DataSource = result.ToList();
        comboMonth.ValueMember = "Value";
        comboMonth.DisplayMember = "Month";
    }
private void AddProjectCombo()
    {
        gridBusinessKMs.Columns["Project"].Visible = false;
        DataGridViewComboBoxColumn cmbCol = new DataGridViewComboBoxColumn();

        cmbCol.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
        cmbCol.HeaderText = "Project";
        cmbCol.Name = "Project ";
        cmbCol.Items.Add("True");

        using (var context = new MileageLogDBContext())
        {
            cmbCol.DataSource = (from p in context.Projects
                                 orderby p.ProjectDescription
                                 select p.ProjectDescription).ToList();
        }
        gridBusinessKMs.Columns.Add(cmbCol);
        gridBusinessKMs.Columns["Project "].DisplayIndex = 1;
    }

我相信ArrayList保存对对象的引用,您可能正在更改对象,从而更改绑定源。(请参阅此问题的答案:)如果绑定源已更改,则DisplayMember的值可能会恢复为对象的ToString方法:

如果对象上不存在指定的属性,或者DisplayMember的值为空字符串(“”),则将显示对象的ToString方法的结果

我不知道
MonthsEnum
MonthList
正在做什么,但我测试了以下代码,它成功了

private void UpdateMonthCombo()
    {
        List<Tuple<int, string>> AL = new List<Tuple<int, string>>();

        string[] monthNames = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;

        for (int i = 0; i < 12; i++)
        {
            AL.Add(new Tuple<int, string>(i + 1, monthNames[i]));
        }

        comboMonth.DataSource = AL;
        comboMonth.ValueMember = "Item1";
        comboMonth.DisplayMember = "Item2";
        comboMonth.SelectedItem = null;
    }
private void UpdateMonthCombo()
{
列表AL=新列表();
字符串[]monthNames=System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.monthNames;
对于(int i=0;i<12;i++)
{
AL.Add(新元组(i+1,monthNames[i]);
}
comboMonth.DataSource=AL;
comboMonth.ValueMember=“Item1”;
comboMonth.DisplayMember=“Item2”;
comboMonth.SelectedItem=null;
}

你能添加一些我们可以检查的代码吗?看起来类对象是用combo绑定的,而不是类的属性/成员。一些特定的代码将有助于了解发生了什么。comboMonth.DataSource=source;这不是数据源对象的名称吗?我已更改为comboMonth.DataSource=AL;但问题仍然存在。我尝试了以下方法:
private void UpdateMonthCombo(){var monthList=CultureInfo.InvariantCulture.DateTimeFormat.MonthNames.Select((项,索引)=>new{Month=item,Value=index+1});var result=monthList.Where(m=>m.Month!=“”);comboMonth.DataSource=result.ToList();comboMonth.ValueMember=“Value”comboMonth.DisplayMember=“Month”}
…它可以在单独的表单上工作,但当添加到我的原始表单时,它只显示组合中导致某些错误的数字(沿“在此上下文中仅支持基元类型或枚举类型。”)我使用LINQ查询填充一些网格。我修改了它们并打开了表单,但comboMonth只显示了从1到12的数字,而不是月份名称。@Salbrox如果您的代码以另一种形式工作,则该错误似乎保留在您的原始形式,而不是您的代码中。我怀疑您的代码是that正在修改combobox的某些部分,displaymember正在恢复为ToString()方法。(如果您注释掉行
comboMonth.displaymember=“Item2”
,则combobox只恢复为当月的数字。)我似乎已经通过重构组合框的SelectedIndexChanged事件修复了组合框。我不知道为什么或如何影响组合框的DisplayMember,但确实如此。但是现在我的gridview被破坏了!它只显示了一列。我有一种方法,可以添加一个带有组合框的列。当我注释掉它时,gridview显示所有列,但o除外最初的combobox只返回到数字!现在对所有这些都感到非常困惑。@Salbrox听起来像个谜。如果你想发布更多的代码片段,我很有兴趣查找该错误。我设法修复了它。但我不明白为什么。我有一个方法提取当前选择的月份,并将其作为参数传递给另一个方法它返回一个值。该方法正在从全局变量中查找值,但也设置为接受与参数相同的值。我更改了代码,使其接受了参数并正常工作。我不明白这会如何影响提供参数的组合框的displaymember。无论如何,现在工作正常。