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