Tôi hiện đang làm việc trên một listview trong winform C# và mỗi khi tôi bấm vào một không gian trống trên listview, mục đã chọn bị mất.ngăn chặn listview để mất mục đã chọn
Trả lời
Tôi nghĩ rằng có một tài sản ngăn chặn điều này xảy ra, nhưng bây giờ tôi không thể tìm thấy nó.
Bạn có thể thử này:
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListView listView = sender as ListView;
if (listView.SelectedItems.Count == 0)
foreach (object item in e.RemovedItems)
listView.SelectedItems.Add(item);
}
Điều này sẽ chỉ hoạt động trong WPF. – Grammarian
@Grammarian - Câu hỏi không chỉ rõ liệu đó là WPF, WinForms, ASP, Silverlight hay bất kỳ thứ gì khác. Tôi chỉ trả lời với cái mà tôi tình cờ đã mở trong IDE lúc này. Bạn nên đăng câu trả lời bằng công nghệ hiển thị C# yêu thích của mình! :-) –
thực sự là quyền của bạn. nó trong winforms – EdgarGad
Đây là khó khăn hơn nhiều việc phải làm trong WinForms hơn trong WPF. WinForms có một sự kiện SelectedIndexChanged
không cho bạn biết bất cứ điều gì về những gì đã được chọn, cộng với nó được kích hoạt mỗi khi một hàng được chọn hoặc bỏ chọn.
Vì vậy, nếu liên tiếp được chọn và bạn chọn một hàng khác nhau, bạn nhận được hai SelectedIndexChanged
sự kiện:
- một sau khi hàng đã chọn không được chọn
- khác khi hàng mới được chọn.
Vấn đề là, trong sự kiện số 1, ListView không có gì được chọn và bạn không biết liệu sự kiện số 2 sắp đến sẽ chọn hàng thứ hai hay không. Điều tốt nhất bạn có thể làm là đợi cho đến khi ứng dụng của bạn không hoạt động (một vài phần nghìn giây sau khi lựa chọn đã thay đổi), và nếu listview vẫn không có gì được chọn, hãy đặt lại hàng đã chọn cuối cùng.
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
ListView lv = (ListView)sender;
if (lv.SelectedIndices.Count == 0)
{
if (!this.appIdleEventScheduled)
{
this.appIdleEventScheduled = true;
this.listViewToMunge = lv;
Application.Idle += new EventHandler(Application_Idle);
}
}
else
this.lastSelectedIndex = lv.SelectedIndices[0];
}
void Application_Idle(object sender, EventArgs e)
{
Application.Idle -= new EventHandler(Application_Idle);
this.appIdleEventScheduled = false;
if (listViewToMunge.SelectedIndices.Count == 0)
listViewToMunge.SelectedIndices.Add(this.lastSelectedIndex);
}
private bool appIdleEventScheduled = false;
private int lastSelectedIndex = -1;
private ListView listViewToMunge;
tôi thực hiện nó như thế này:
private void lvReads_MouseUp(object sender, MouseEventArgs e)
{
if (lvReads.SelectedItems.Count == 0)
if (lvReads.Items.Count > 0)
lvReads.Items.Find(currentName, false)[0].Selected = true;
}
và
private void lvReads_SelectedIndexChanged(object sender, EventArgs e)
{
if (lvReads.SelectedItems.Count == 1)
{
selectedIndex = lvReads.SelectedIndices[0];
if (currentName != lvReads.Items[selectedIndex].Name)
{
//load item
}
currentName = lvReads.Items[selectedIndex].Name;
}
}
Đây là giải pháp hiệu quả với mã tối thiểu. – hfann
Bạn cần phải kế thừa từ lớp ListView và làm một số xử lý thông báo ở mức độ thấp
class ListViewThatKeepsSelection : ListView
{
protected override void WndProc(ref Message m)
{
// Suppress mouse messages that are OUTSIDE of the items area
if (m.Msg >= 0x201 && m.Msg <= 0x209)
{
Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
var hit = this.HitTest(pos);
switch (hit.Location)
{
case ListViewHitTestLocations.AboveClientArea:
case ListViewHitTestLocations.BelowClientArea:
case ListViewHitTestLocations.LeftOfClientArea:
case ListViewHitTestLocations.RightOfClientArea:
case ListViewHitTestLocations.None:
return;
}
}
base.WndProc(ref m);
}
}
Câu trả lời tương tự ở đây: http://stackoverflow.com/a/3255191/188926 – Dunc
Điều khiển danh sách xem có HideSelection
thuộc tính mặc định là True
. Làm cho nó False
và bạn tốt để đi ... trong một số trường hợp này là đủ.
Điều này không giải quyết được vấn đề được đăng, anh ấy không gặp vấn đề gì khi bỏ chọn mục khi mất tiêu điểm. – Hugoagogo
Hiệu chỉnh: anh * đang * có vấn đề với các mục đã bỏ chọn.Các mục đã chọn sẽ không được đánh dấu bởi vì điều khiển mất các mục được chọn. – Suncat2000
- 1. Cách lấy mục đã chọn từ ListView?
- 2. Làm thế nào để ngăn chặn các mục ListView higlighting trong Black
- 3. Làm cách nào để ngăn chặn chân trang ListView trở thành lựa chọn?
- 4. Nhận mục đã chọn trong ListView win32 API
- 5. Cách xóa mục đã chọn khỏi ListView bằng CursorAdapter
- 6. Android ListView và OnClickListener: Cách lấy mục đã chọn
- 7. Cách đánh dấu mục đã chọn trong ListView?
- 8. Ngăn chặn menu chọn mở
- 9. JavaFX chọn mục trong ListView
- 10. ListView setOnItemClickListener và setOnItemSelectedListener để lưu trữ chỉ mục mục đã chọn
- 11. Làm cách nào để bỏ chọn mục trong ListView?
- 12. Disallow ListView để không có các mục được chọn
- 13. Lấy phần tử đã chọn từ ListView
- 14. Ngăn chặn lựa chọn trong HTML
- 15. WPF ListView - làm thế nào để tôi thiết lập màu nền của mục đã chọn?
- 16. ListView Mục bóng + bộ chọn tùy chỉnh
- 17. Chọn tất cả các mục trong ListView
- 18. Danh sáchXem cuộn đến mục đã chọn
- 19. Ngăn chặn ArrayList.Add() trả về chỉ mục
- 20. Lấy mục đã chọn
- 21. Thực hiện một listview bên trong một ngăn kéo trượt với một listview đã hiện diện
- 22. Android listview nền đã chọn không hoạt động trong 2.3
- 23. Wheres dấu vết ngăn xếp của tôi đã biến mất?
- 24. Cách liên kết Nhãn JavaFX với mục đã chọn từ một ListView
- 25. getItemAtPosition() Cách lấy dữ liệu có thể đọc từ mục đã chọn trong ListView
- 26. Mục tiêu-C: cách ngăn chặn rò rỉ trừu tượng
- 27. Winforms - Cách ngăn lựa chọn mục Listbox
- 28. Làm thế nào để ngăn chặn sự kiện đã chọn được thay đổi khi DataSource bị ràng buộc?
- 29. Ngăn chặn chọn ngẫu nhiên/kéo nổi bật
- 30. Làm thế nào để ngăn chặn MSBuild _WPPCopyWebApplication mục tiêu làm sạch thư mục App_Data
WinForms hoặc WPF? Không gian trống ở bên phải hoặc bên dưới? Bạn muốn điều gì xảy ra? – Grammarian
có thể trùng lặp của [Disallow ListView để có 0 mục đã chọn] (http://stackoverflow.com/questions/3255046/disallow-listview-to-have-zero-selected-items) –
trong thuộc tính ... HideSelection = False và FullRowSelect = True –