2013-02-26 39 views
10

Tôi có thuộc tính MultiSelect của listView được đặt thành false và tôi đang cố gắng lấy một listViewItem duy nhất. Nhưng tài sản có sẵn là SelectedItems. Tôi đã sử dụng mã sau ...Lấy danh sách duy nhấtXem SelectedItem

foreach (ListViewItem item in listView1.SelectedItems) 
{ 
    //do something with item.text or whatever 
} 

Vì tôi biết sẽ chỉ có một mục được chọn. Cách làm đúng là gì?

Trả lời

16

Thường là SelectedItems trả về bộ sưu tập, mảng hoặc IQueryable.

Dù bằng cách nào bạn có thể truy cập vào mục qua Index như với một mảng:

String text = listView1.SelectedItems[0].Text; 
//do something 

Bởi theo cách bạn luôn có thể tiết kiệm một mục mà bạn muốn xem xét vào một var lookat = whatever you want và kiểm tra cấu trúc của nó trong dân địa phương sau khi cài đặt một breakpoint.

+1

đừng quên kiểm tra listView1.SelectedItems.Count để ngăn chặn ngoại lệ con trỏ null –

8

Tôi làm điều này như thế:

if (listView1.SelectedItems.Count > 0) 
{ 
    var item = listView1.SelectedItems[0]; 
    //rest of your logic 
} 
4

Đôi khi chỉ sử dụng các dòng dưới đây ném cho tôi một ngoại lệ,

String text = listView1.SelectedItems[0].Text; 

vì vậy tôi sử dụng mã này dưới đây:

private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (listView1.SelectedIndices.Count <= 0) 
    { 
     return; 
    } 
    int intselectedindex = listView1.SelectedIndices[0]; 
    if (intselectedindex >= 0) 
    { 
     String text = listView1.Items[intselectedindex].Text; 

     //do something 
     //MessageBox.Show(listView1.Items[intselectedindex].Text); 
    } 
} 
1

Nếu nó chỉ là một ứng dụng nhỏ bé với một hoặc hai bản xem trước tôi thường chỉ tạo ra một tài sản trợ giúp nhỏ:

private ListViewItem SelectedItem { get { return (listView1.SelectedItems.Count > 0 ? listView1.SelectedItems[0] : null); } } 

Nếu tôi có tải, sau đó di chuyển nó ra một lil' lớp helper:

internal static class ListViewEx 
{ 
    internal static ListViewItem GetSelectedItem(this ListView listView1) 
    { 
     return (listView1.SelectedItems.Count > 0 ? listView1.SelectedItems[0] : null); 
    } 
} 

vậy:

ListViewItem item = lstFixtures.GetSelectedItem(); 

Giao diện ListView là một chút rác vì vậy tôi thường tìm lớp người trợ giúp phát triển khá nhanh chóng

0

Đối với tình huống giỏ hàng, đây là những gì tôi đề nghị. Tôi sẽ chia nó thành dạng đơn giản nhất.

Giả sử chúng ta bắt đầu với điều này (một cái nhìn danh sách với 2 colums, 2 nút, và một nhãn): điều starting

Trước tiên, loại bỏ các mục, để làm được điều đó chúng tôi sẽ nhập nút remove chúng tôi:

private void button2_Click(object sender, EventArgs e) 
{ 
    listView1.Items.Remove(listView1.SelectedItems[0]); 
    label1.Text = updateCartTotal().ToString(); 
} 

Bây giờ dòng thứ hai đang cập nhật nhãn của chúng tôi tổng sử dụng chức năng tiếp theo tôi sẽ gửi đến addup tất cả các tổng của cột 2 trong listview:

private decimal updateCartTotal() 
{ 
    decimal runningTotal = 0; 
    foreach(ListViewItem l in listView1.Items) 
    { 
     runningTotal += Convert.ToDecimal(l.SubItems[1].Text); 
    } 
    return runningTotal; 
} 

Bạn không cần phải sử dụng thập phân như tôi đã làm, bạn có thể sử dụng float hoặc int nếu bạn không có số thập phân. Vì vậy, hãy phá vỡ nó xuống. Chúng tôi sử dụng vòng lặp for để tổng tất cả các mục trong cột 2 (SubItems [1] .Text). Thêm nó vào một số thập phân mà chúng tôi đã khai báo trước vòng lặp foreach để giữ tổng số.Nếu bạn muốn thực hiện thuế, bạn có thể làm điều gì đó như:

return runningTotal * 1.15; 

hoặc bất kỳ mức thuế suất nào của bạn.

Lâu dài và ngắn gọn, sử dụng chức năng này, bạn có thể đếm ngược chế độ xem danh sách của mình bằng cách chỉ cần gọi hàm. Bạn có thể thay đổi các nhãn văn bản như tôi demo'd trước nếu đó là những gì bạn đang sau.

0

Không có câu trả lời nào ở trên, ít nhất là với tôi, cho biết cách thực sự xử lý xác định xem bạn có 1 mục hay nhiều hay không và cách thực sự lấy giá trị ra khỏi mục của bạn theo cách chung thực sự chỉ có một mục, hoặc nhiều, vì vậy tôi đang ném chiếc mũ của mình vào chiếc nhẫn.

Điều này khá dễ dàng và quát thực hiện bằng cách kiểm tra số của bạn để thấy rằng bạn có ít nhất một mục, sau đó thực hiện một vòng lặp foreach trên .SelectedItems, đúc từng hạng mục như một DataRowView:

if (listView1.SelectedItems.Count > 0) 
{ 
    foreach (DataRowView drv in listView1.SelectedItems) 
    { 
     string firstColumn = drv.Row[0] != null ? drv.Row[0].ToString() : String.Empty; 
     string secondColumn = drv.Row[1] != null ? drv.Row[1].ToString() : String.Empty; 
     // ... do something with these values before they are replaced 
     // by the next run of the loop that will get the next row 
    } 
} 

chí này làm việc, cho dù bạn có 1 mục hay nhiều. Thật thú vị khi MSDN says sử dụng ListView.SelectedListViewItemCollection để chụp listView1.SelectedItems và lặp lại thông qua điều đó, nhưng tôi thấy rằng điều này đã xảy ra lỗi trong ứng dụng WPF của tôi: The type name 'SelectedListViewItemCollection' does not exist in type 'ListView'.

Các vấn đề liên quan