2012-03-16 110 views
17

Tôi hiện đang vật lộn với GUI của ứng dụng của mình. Tôi có một thời gian khó khăn để tìm ra cho dù ListBox hoặc ListView là nhiều hơn "phù hợp" cho đại diện đa cột dữ liệu.ListView và ListBox để sử dụng nhiều cột

Tôi thích mã "sạch" không quá khó hiểu, vì mã spaghetti và các phương pháp lấy cắp dữ liệu có thể dẫn đến nhầm lẫn.

Làm cách nào để cả ListBox và ListView xử lý nhiều cột?

+2

Làm thế nào về 'DataGridView'? –

+0

@BryanCrosby, im đang làm việc với dữ liệu Danh sách ngay bây giờ. Tôi hiểu rằng DataGridView phù hợp với dữ liệu cơ sở dữ liệu. – JavaCake

+0

Bạn nói bạn có biểu diễn nhiều cột. Đó là một cái bàn, đó là lý do tại sao tôi đề nghị nó. Cấu trúc dữ liệu của bạn là gì? –

Trả lời

11

Chắc chắn không có gì sai với một DataGridView trong kịch bản này.

mẫu:

class Car 
{ 
    public string Make { get; set; } 
    public string Model { get; set; } 
    public int Year { get; set; } 
} 

Một chức năng để nạp dữ liệu vào DataGridView

private void LoadData() 
{ 
    List<Car> cars = new List<Car>() 
    { 
     new Car() { Make = "Subaru", Model = "Impreza", Year = 2005 }, 
     new Car() { Make = "Ford", Model = "Mustang", Year = 1984 } 
    }; 

    dataGridView1.DataSource = cars; 
} 

Tất nhiên, từ đây mọi thứ có thể trở nên phức tạp hơn, nhưng nếu bạn chỉ muốn hiển thị dữ liệu trong một thời trang dạng bảng ... nó khá đơn giản.

+1

Hoàn hảo. Chính xác những gì tôi đang tìm kiếm. Chỉ phải thêm một dòng mã đã khởi tạo nguồn dữ liệu và nó đã làm phép thuật. – JavaCake

+1

Có thể loại trừ bất kỳ cột nào hoặc thay đổi thứ tự của chúng không? – JavaCake

+2

@JavaCake: Bạn có thể truy cập các cột với chỉ mục có tên hoặc thứ tự của chúng. Ví dụ 'DataGridView.Columns [0]'. Có một thuộc tính 'DisplayIndex' kiểm soát cách chúng có thể được hiển thị. Ngoài ra còn có thuộc tính 'Có thể nhìn thấy 'kiểm soát khả năng hiển thị. –

2

ListView tốt hơn cho việc biểu diễn dữ liệu nhiều cột. Tuy nhiên nó dường như nhận được mã phức tạp/xấu hơn một ListBox đơn giản.

Vẫn còn tốt hơn nhiều vì nhiều lý do, cột có thể định lại và tất cả các cột đó.

Tôi không nghĩ rằng ListBox có nhiều cột, do đó bạn sẽ phải hack cái gì xấu xí trong.

http://www.xtremedotnettalk.com/showthread.php?t=93443

+0

Tất cả các ví dụ tôi có thể tìm thấy trên cả hai loại kết thúc trong mã hơi lộn xộn. Nhưng như bạn nói, ListView có vẻ phù hợp hơn nhiều. Bạn có thể cho một mã số mã trên một ListView nhiều cột không? Cảm ơn. – JavaCake

+0

Điều khiển ListBox chắc chắn hỗ trợ [nhiều cột] (http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.multicolumn.aspx). –

+0

"Hộp danh sách nhiều cột đặt các mục vào bao nhiêu cột cần thiết để làm cho cuộn dọc không cần thiết". Tôi không nghĩ rằng nó hữu ích. – Haedrian

4

Kiểm tra này ra

https://stackoverflow.com/a/227355/988830

Mặc dù listbox được sử dụng cho cột duy nhất và listview được sử dụng cho mutlicolumn, câu trả lời là tất cả phụ thuộc.

Đôi khi bạn có thể cần danh sách đa cột nơi bạn cần thêm các loại khác nhau của trẻ em. Bạn không thể ràng buộc chúng bằng cách sử dụng listview vì vậy tốt hơn để sử dụng listbox trong các tình huống như vậy. Nhưng nếu bạn muốn sắp xếp chúng bằng cách sử dụng tiêu đề, hãy sử dụng listview vì nó đơn giản. Trong kết luận, tôi sẽ nói nếu bạn chỉ có dữ liệu đa cột và không có gì tốt hơn để sử dụng listview khác nếu bạn muốn làm những thứ ưa thích như nút, treeview, expander vv ListBox là thực sự mát mẻ.

Cảm ơn, Omkar

4

Một DataGridView là tốt đẹp nếu bạn muốn để có thể chỉnh sửa dữ liệu trực tiếp từ lưới điện, giống như một bảng tính. Chế độ xem danh sách ở chế độ chi tiết rất tuyệt vời cho việc trình bày đơn giản danh sách các cột dữ liệu. Một DataGridView cũng sẽ dễ dàng hơn để sắp xếp, theo như tôi biết.

Nói chung tôi làm điều gì đó như thế này:

private void UpdateListView() 
{ 
    mListView.Items.Clear(); 
    foreach (Item item in mItems) 
    { 
     ListViewItem listViewItem = 
     new ListViewItem(item.Value1.ToString()) { Tag = item; } 
     listViewItem.SubItems.Add(item.Value2.ToString()); 
     listViewItem.SubItems.Add(item.Value3.ToString()); 
     mListView.Items.Add(listViewItem); 
    } 
} 

Các cột sẽ cần phải đã được xác định trong thiết kế, bao gồm văn bản tiêu đề cột và độ rộng cột.

Với Thẻ = mục; phần bạn sẽ có thể truy cập các đối tượng được chọn với:

if (mListView.SelectedIndices.Count <= 0) 
     return; 

    Item selectedItem = mListView.SelectedItems[0].Tag as Item; 
    if (selectedItem == null) 
     return; 

    // do something with selectedItem 
Các vấn đề liên quan