【问题标题】:How to get selected object in a listview and winforms如何在列表视图和winforms中获取选定的对象
【发布时间】:2014-11-16 02:21:42
【问题描述】:

我有我的班级“公司”的列表

private List<Company> company = new List<Company>();

然后我在表单中添加了一个列表视图。列表视图由上面列表中的对象填充。我在表单中有几个文本框,显示有关公司的信息。 第一次在列表视图中选择对象时,它工作正常。第二次选择对象时,出现此错误:

ERROR: object reference not set to an instance of an object    

selectedIndexChanged 事件的代码:

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        ListView item = ((ListView)sender);
        int index = item.FocusedItem.Index;
        Company company = ReturnCompany(index);
        DoStuff(company);
    }

返回对象的代码:

private Company ReturnCompany(int index)
    {
        return company[index];
    }

填充文本框的代码:

private void DoStuff(Company i)
    {
        txtCompanyName.Text = i.CompanyName;
        txtBusiness.Text = i.Business;
        txtCity.Text = i.City;
        txtCountry.Text = i.Country;
    }

如果有人能帮我解决这个问题,我会很高兴。

【问题讨论】:

    标签: c# winforms listview


    【解决方案1】:

    我以前从未真正使用过FocusedItem

    FocusedItem 属性返回 ListViewItem,它表示当前显示 ListView 控件焦点矩形的项目。

    这听起来有点不可靠,因为它只报告一个围绕它有一个焦点矩形的项目。不确定如果选择了一个项目会发生什么,但表单上的另一个控件恰好具有焦点。

    在你的情况下,FocusedItemnull,所以你得到了一个例外。尝试改用SelectedIndices,它会返回您在列表中选择的每个项目的索引集合。

    确保至少选择了一项(因为当您取消选择一项时也会触发此事件),然后使用选定的索引使用现有代码查找您的公司。

    ListView compListView = ((ListView)sender);
    
    if (compListView.SelectedIndices.Count > 0)
    {
        var selectedCompany = companies[compListView.SelectedIndices[0]];
    
        DoStuff(selectedCompany);
    }
    

    【讨论】:

    • 我实际上已经尝试强制转换compListView.SelectedItems[0],这会给我另一个错误:错误无法将类型'System.Windows.Forms.ListViewItem'转换为'WindowsFormsApplication2.Company'
    • 是否可以在 linq 中做到这一点?
    • 只是好奇,我对我们实际上可以用 linq 做什么印象深刻。有时我通过使用 linq 将我的代码行数从十行减少到了一行。所以这似乎是一个我应该阅读更多的领域。
    【解决方案2】:

    哪一行抛出异常?试试这个:

     private void listView1_SelectedIndexChanged(object sender, EventArgs e)
     {
        ListView item = ((ListView)sender);
        int index = item.FocusedItem.Index;
        if (company.Any() && (0 <= index || index < company.Count))
        {
            Company company = ReturnCompany(index);
            DoStuff(company);
        }
    }
    

    【讨论】:

    • 抱歉,这行抛出异常int h = item.FocusedItem.Index;
    • 我的代码出现了同样的异常。 int h = item.FocusedItem.Index;
    • item.FocusedItem 返回 null ?
    • 该行给了我以下信息:ERROR: object reference not set to an instance of an object
    【解决方案3】:

    我认为你的代码应该做你想做的事,也许填充列表视图有问题,尝试像这样填充它然后尝试我希望这会对你有所帮助:)

            private List<Company> company = new List<Company>();
            //maybe you have 100 name of companies 
            Company[] companyNames = new Company[100];
    
    
            int i = 0;
            while(i<100)
            {
            foreach (Company cmpny in company)
            {
                companyNames[i] = cmpny;
    
                i++;
            }
            }
             var listViewItem = new ListViewItem(companyNames); 
             listView1.Items.Add(listViewItem);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多