我正在尝试通过按钮向上/向下移动选定的 ListView 项目。 该项目被删除并插入到同一索引处。但我想将其添加到索引+1(向下)或索引-1(向上)
我有 4 个项目,并尝试向下移动第 2 个项目(在索引 1 处) 这是我的 down_click 过程的示例
private void down_Click(object sender, EventArgs e)
{
ListViewItem selected = listView1.SelectedItems[0];
int sel_index = listView1.SelectedItems[0].Index;
int newindex = sel_index + 1;
listView1.Items.RemoveAt(sel_index);
listView1.Items.Insert(newindex, selected);
}
最佳答案
其实你的代码没有任何问题。问题出在 ListView 上。
当您使用 ListView 并将 View 属性设置为 LargIcon(即 view 属性的默认值)、SmallIcon 或 Tile View 时,插入项目不会按预期工作,但在列表和详细信息 View 中它会按预期工作。
要解决此问题,您可以执行以下任一操作:
解决方案 1:(解决方法)
设置View property ListView 到详细信息或列表。
解决方案 2:(更好、更完整的解决方案)
要解决所有 View 中的问题,请使用此 UpdateLayout 方法并在插入项目后调用它。
private void UpdateLayout()
{
if (this.listView1.View == View.LargeIcon ||
this.listView1.View == View.SmallIcon ||
this.listView1.View == View.Tile)
{
listView1.BeginUpdate();
//Force ListView to update its content and layout them as expected
listView1.Alignment = ListViewAlignment.Default;
listView1.Alignment = ListViewAlignment.Top;
listView1.EndUpdate();
}
}
所以 UpButton 和 DownButton 代码可能是这样的:
private void UpButton_Click(object sender, EventArgs e)
{
//If there is a selected item in ListView
if (this.listView1.SelectedIndices.Count >= 0)
{
//If selected item is not the first item in list
if (this.listView1.SelectedIndices[0] > 0)
{
var index = this.listView1.SelectedItems[0].Index;
var item = this.listView1.SelectedItems[0];
this.listView1.Items.RemoveAt(index);
this.listView1.Items.Insert(index - 1, item);
this.UpdateLayout();
}
}
}
private void DownButton_Click(object sender, EventArgs e)
{
//If there is a selected item in ListView
if (this.listView1.SelectedIndices.Count >= 0)
{
//If selected item is not the last item in list
if (this.listView1.SelectedIndices[0] < this.listView1.Items.Count - 1)
{
var index = this.listView1.SelectedItems[0].Index;
var item = this.listView1.SelectedItems[0];
this.listView1.Items.RemoveAt(index);
this.listView1.Items.Insert(index + 1, item);
this.UpdateLayout();
}
}
}
附加说明
为了更好地查看 ListView,请在设计器或代码中设置这些属性:
- 设置MultiSelect设置为 false,以防止选择多个项目
- 设置FullRowSelect设置为 true 可通过单击行中的任意位置来启用选择
- 设置HideSelection = false 即使 ListView 没有焦点也会突出显示所选项目
关于c# - ListView 项目不移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32299729/