【问题标题】:Subset List of parent List not binding to Listbox in Winforms父列表的子集列表未绑定到 Winforms 中的列表框
【发布时间】:2015-12-10 16:15:25
【问题描述】:

我正在尝试将自定义类的列表绑定到列表框,但无法显示任何内容。该列表是另一个列表的子集。我可以绑定父列表并查看项目,但不能绑定子列表。如何让子集列表绑定到列表框?我尝试更改 ListBox 的 DisplayMember、ValueMember 和 DataSource 属性的顺序。在调试中,我可以看到 DataSource 具有正确的值,但我无法显示它们。相关代码如下:

public class DimZone
{
    public int Zone_Key { get; set; }
    public int Zone_ID { get; set; }
    public int Facility_Key { get; set; }
    public string Zone_Name { get; set; }
    public string Zone_Type { get; set; }
}

包含全局 List 集合的 GlobalVariables 类:

public static List<DimZone>[] zoneCollection = new List<DimZone>[maxServerCount];

使用全局 List 集合和子集 List 的表单:

List<DimZone> zoneCollectionAppended = new List<DimZone>();

private void StaffStatusReportForm_Load(object sender, EventArgs e)
    {
        facilityComboBox.DataSource = GlobalVariables.facilityCollection;
        GetFacilityIndex();
        CreateZoneAppendedList();
        PopulateUI();
    }

private void CreateZoneAppendedList()
    {
        foreach (var zone in GlobalVariables.zoneCollection[currentFacilityIndex])
        {
            if (zone.Zone_Name != "All")
            {
                zoneCollectionAppended.Add(zone);
            }
        }
    }

private void PopulateUI()
    {
        if (zoneCollectionAppended != null)
        {
            zoneListBox.DisplayMember = "Zone_Name";
            zoneListBox.ValueMember = "Zone_ID";
            zoneListBox.DataSource = zoneCollectionAppended;
        }
    }

【问题讨论】:

    标签: c# winforms visual-studio-2013 data-binding listbox


    【解决方案1】:

    您的代码包含各种不清楚的部分。无论如何,在这些情况下最好的做法是设置一个正常工作的更简单的代码并对其进行修改,直到达到您想要的阶段。我可以提供这个正常工作的第一步。示例代码:

    private void Form1_Load(object sender, EventArgs e)
    {
        List<DimZone> source = new List<DimZone>();
        DimZone curZone = new DimZone() { Zone_Key = 1, Zone_ID = 11, Facility_Key = 111, Zone_Name = "1111", Zone_Type = "11111" };
        source.Add(curZone);
        curZone = new DimZone() { Zone_Key = 2, Zone_ID = 22, Facility_Key = 222, Zone_Name = "2222", Zone_Type = "22222" };
        source.Add(curZone);
    
        zoneListBox.DisplayMember = "Facility_Key";
        zoneListBox.DataSource = source;
    }
    
    public class DimZone
    {
        public int Zone_Key { get; set; }
        public int Zone_ID { get; set; }
        public int Facility_Key { get; set; }
        public string Zone_Name { get; set; }
        public string Zone_Type { get; set; }
    }
    

    尝试此代码并确认zoneListBox.DisplayMember 中的更改(例如"Zone_Key""Zone_ID" 等)立即反映在zoneListBox 显示的值中。

    【讨论】:

    • 抱歉,我想澄清一下,但是当我习惯使用此代码库时,这可能会很困难。我可以获得与任何属性的基本绑定以使用 List GlobalVarables.zoneCollection[currentFacilityIndex]。一旦我切换到 zoneCollectionAppended List,它就无法正常工作。绑定到列表有问题,我不明白为什么。两个列表之间的唯一区别是一个列表不包含“全部”成员。我需要更改 UI,以便在不更改 GlobalVariables.zoneCollection[] 的情况下,“All”不会显示在列表框中。
    • @mlabus93 zoneCollectionAppended 和我的答案中的代码之间的唯一区别是它是一个全局变量(根本不重要;另一方面,您的情况)。如果您没有以任何其他方式影响zoneListBox,那么您的代码应该可以正常工作。出现意外行为的最可能原因是 DataSource 不包含您的想法(无法从您的代码中看出)。你调试过代码吗?您确定zoneCollectionAppended 包含您认为它包含的所有值吗?
    • @mlbus93 如前所述,保持简单。打开一个新的解决方案,编写我的代码(包括硬编码的输入)并不断改进它,直到找到问题为止。尽管如前所述,这种情况似乎很清楚,进行逐步调试应该可以帮助您了解DataSource 的问题(因为它一定有问题)。
    • 好的,我会尝试使用您的代码并构建它。我将我的 DataSource 设置为 zoneCollectionAppended 并在绑定代码行使用断点对其进行调试。我可以清楚地看到我的数据以正确的值显示在 zoneCollectionAppended 中。当我进入下一行时,我可以看到 zoneListBox.DataSource 也具有正确的值,因此令人困惑。不过,感谢您的帮助。
    • @mlabus93 我坚持:你报告的内容没有任何意义。有两个可能的原因可以解释为什么会发生没有任何意义的事情: .NET 错误(这里不太可能);或者您的代码的其他部分未按预期运行(= 您在代码中其他地方所做的某事影响了这部分)。因此,最好的方法是从正常工作的代码(如我提供的代码)中重新做所有事情。在这种情况下,我(或任何其他人)无法帮助您。
    【解决方案2】:

    问题是我在加载时将zoneListBox.DataSource 从一个源更改为另一个源,这导致了错误。为了使数据源正确更新,我必须在更新到新数据源之前设置zoneListBox.DataSource = null。我不知道为什么我必须先将其设置为 null,但它解决了我的问题。所以我更新的代码如下:

    private void PopulateUI()
    {
        if (zoneCollectionAppended != null)
        {
            zoneListBox.DisplayMember = "Zone_Name";
            zoneListBox.ValueMember = "Zone_ID";
    
            //DataSource had to be reset to null before updating to new DataSource
            zoneListBox.DataSource = null;
    
            zoneListBox.DataSource = zoneCollectionAppended;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 1970-01-01
      • 2012-10-12
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 2011-08-28
      相关资源
      最近更新 更多