gpt4 book ai didi

c# listview 取消选择项目

转载 作者:太空狗 更新时间:2023-10-29 20:23:41 24 4
gpt4 key购买 nike

我正在开发一个 Windows 应用程序,它有一个包含大量项目的 ListView。 当用户单击某个项目时,应用程序会显示该项目的详细信息。这 然后用户有机会编辑这些详细信息。用户应该点击 每次更改后的保存按钮,当然这并不总是发生。

如果用户进行更改但未单击“保存”,应用会显示一条消息 询问他们是否要保存更改的框。此框包含取消 按钮,如果他们单击取消,我想短路选择 另一项并让用户停留在他们正在编辑的项上。

我找不到执行此操作的方法,如果项目更改但未保存,我会显示 itemselecedchanged 事件的对话框,如果用户单击取消,我会从事件中删除我的功能并手动更改所选项目,然后我将函数返回给事件,但在此之后事件调用和我手动选择的项目未被选中。

    private bool EnsureSelected()
{
bool continue_ = true;
if (_objectChange)
{
var res = MessageBox.Show("Do you want to save changes?", "Warning", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
switch (res)
{
case DialogResult.Cancel:
if (!string.IsNullOrEmpty(_selectedKey))
{
listView_Keys.ItemSelectionChanged -= listView_Keys_ItemSelectionChanged;
listView_Keys.Focus();
listView_Keys.Items[_selectedKey].Selected = true;
listView_Keys.ItemSelectionChanged += listView_Keys_ItemSelectionChanged;
}
continue_ = false;
break;
case DialogResult.Yes:
button_Save.PerformClick();
_objectChange = false;
break;
case DialogResult.No:
_objectChange = false;
break;
default:
throw new ArgumentOutOfRangeException();
}
}
return continue_;
}

更新::

我试过这个解决方案:

        public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private ListViewItem currentSelection = null;
private bool pending_changes = false;
private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
if (e.Item == currentSelection)
{
// if the current Item gets unselected but there are pending changes
if (!e.IsSelected && pending_changes)
{
var res = MessageBox.Show("Do you want to save changes?", "Warning", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
switch (res)
{
case DialogResult.Cancel:
// we dont want to change the selected item, so keep it selected
e.Item.Selected = true;
break;
case DialogResult.Yes:
//button_Save.PerformClick();
pending_changes = false;
break;
case DialogResult.No:
pending_changes = false;
break;
default:
throw new ArgumentOutOfRangeException();
}
}

}
else // not the selected button
{
if (!pending_changes && e.IsSelected)
{
// Item may be selected and we save it as the new current selection
currentSelection = e.Item;
}
else if (pending_changes && e.IsSelected)
{
// Item may not be enabled, because there are pending changes
e.Item.Selected = false;
}
}
}

private void Form1_Load(object sender, EventArgs e)
{
listView1.Items[0].Selected = true;
}

private void button1_Click(object sender, EventArgs e)
{
pending_changes = true;
}
}

但这没有用,第一次挂起的更改为真时,消息框调用了两次,第二次什么也没发生。

最佳答案

首先,每当您选择另一个项目时,该事件应该触发两次。

首先针对取消选择的项目(其中 e.IsSelectedfalse)

第二个用于选择的项目(其中 e.IsSelectedtrue)

假设您设置了一个标记 pending_changes,只要有未保存的更改,下面的代码应该取消项目选择。

不幸的是,无论何时显示 MessageBox,listView 都会再次失去焦点。当您单击离开 MessageBox 时,焦点将返回到 listView 上,这会导致控件再次触发其事件。这就是为什么需要一个肮脏的解决方法,需要记住我们在消息框上单击了“取消”并再次对下一个事件执行操作。

这是包含解决方法的代码:

private ListViewItem currentSelection = null;
private bool pending_changes = false;
private bool cancel_flag = false;
private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
Console.WriteLine("Item " + e.ItemIndex + " is now " + e.IsSelected);
if (e.Item != currentSelection)
{
// if another item gets selected but there are pending changes
if (e.IsSelected && pending_changes)
{
if (cancel_flag)
{
// this handles the second mysterious event
cancel_flag = false;
currentSelection.Selected = true;
e.Item.Selected = false;
return;
}
Console.WriteLine("uh oh. pending changes.");
var res = MessageBox.Show("Do you want to save changes?", "Warning", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
switch (res)
{
case DialogResult.Cancel:
// we dont want to change the selected item, so keep it selected
currentSelection.Selected = true;
e.Item.Selected = false;
// for some reason, we will get the same event with the same argments again,
// after we click the cancel button, so remember our decision
cancel_flag = true;
break;
case DialogResult.Yes:
// saving here. if possible without clicking the button, but by calling the method that is called to save
pending_changes = false;
currentSelection = e.Item;
break;
case DialogResult.No:
pending_changes = false;
currentSelection = e.Item;
break;
default:
throw new ArgumentOutOfRangeException();
}
}
else if (e.IsSelected && !pending_changes)
{
currentSelection = e.Item;
}
}
}

关于c# listview 取消选择项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30385294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com