在C#中将列表绑定到comboBox

时间:2016-07-24 06:16:13

标签: c# generics combobox

我在WinForm中有三个组合框。为了用数据加载这些组合,我创建了三种方法。 其中两种方法如下所示:

private void cmbLoadSubjects(List<Subject> subjects)
    {
        BindingSource source = new BindingSource();
        source.DataSource = subjects;

        cmbSubjects.DataSource = source;
        cmbSubjects.DisplayMember = "name";
        cmbSubjects.ValueMember = "id";
    }

private void cmbLoadTeachers(List<Teacher> teachers)
    {
        BindingSource source = new BindingSource();
        source.DataSource = teachers;

        cmbTeachers.DataSource = source;
        cmbTeachers.DisplayMember = "name";
        cmbTeachers.ValueMember = "id";
    }

这个想法是在组合中显示主题的名字和教师的名字。

Combo box showing teachers

鉴于这些方法非常相似,我尝试创建一个可以加载所有组合的通用方法。所以我想出了这个:

private void cargarCombo<T>(ComboBox combo, List<T> data, string displayMember, string valueMember)
    {
        BindingSource source = new BindingSource();
        source.DataSource = data;

        combo.DataSource = source.DataSource;
        cmbEstadoAsistencia.DisplayMember = displayMember;
        cmbEstadoAsistencia.ValueMember = valueMember;
    }

如果我使用此方法加载我的组合,它只能在其中一个组合中正常工作。在其他组合中,它显示了典型的“WorkspaceName.ClassName”。 Combo box of teachers when using generic method

我尝试加载教师,然后尝试在唯一正常工作的组合中加载主题并显示它应该显示的内容:

Teacher loaded with generic method Subjects loaded with generic method

但是当我尝试使用这种通用方法加载其他组合时,尽管有对象的类,我得到“Workspace.Teacher”,“Workspace.Subject”。

我比较了试图找到不同内容的三个组合的属性值,以便发现可能导致这种行为的原因,并且它们的名称和位置不同。

我尝试创建一个新的组合并加载不同类别对象的列表,但问题仍然存在。

一个奇怪的是,如果我使用我在问题开始时向您展示的方法,一切正常。我的意思是,我可以利用这些方法而忘记这个愚蠢的问题,但我很好奇......我只是不明白为什么泛型方法只能在一个组合中正常工作。

2 个答案:

答案 0 :(得分:1)

我发现了问题。问题是我有时候是个白痴:

private void cargarCombo<T>(ComboBox combo, List<T> data, string displayMember, string valueMember)
{
    BindingSource source = new BindingSource();
    source.DataSource = data;

    combo.DataSource = source.DataSource;
    cmbEstadoAsistencia.DisplayMember = displayMember;
    cmbEstadoAsistencia.ValueMember = valueMember;
}

cmbEstadoAsistencia 应更改为组合

我正在硬编码其中一个组合框的名称。 我很抱歉发布垃圾:(

答案 1 :(得分:0)

你的错误可能在这里

combo.DataSource = source.DataSource;

将其更改为

combo.DataSource = source;