listbox里面项的删除方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了listbox里面项的删除方法相关的知识,希望对你有一定的参考价值。

如图我的删除代码
int index = ListBox1.SelectedIndex;
int index = ListBox1.SelectedIndex;
if (index < 0)

Response.Write("<script>alert('请选中要删除的项 ')</script>");

else

ListBox1.Items.RemoveAt(index);

问题出在当我在里面插入或者添加再循环上下移动后Index的值却没有变,比如最初index的值是2,执行以上操作后我想删除最后一项,实际删除的确实不是最后一项!
帮帮忙。。。。换种想法也行!!
插入:
int i = ListBox1.SelectedIndex;
string item = TextBox1.Text;
ListBox1.Items.Insert(i, item);
循环上移:思路:先把选中项一直下移,当移到最下面的时候与最上面项交换值,然后再继续下移,移动(count-1)次就实现了,for语言用于循环移动,下移同理
int count = ListBox1.Items.Count;
int index = ListBox1.SelectedIndex;
string temp;
for (int i = 0; i < (count - 1); i++)

if (index >= (count - 1) || index < 0)

//头尾交换
temp = ListBox1.Items[count - 1].Text;
ListBox1.Items[count - 1].Text = ListBox1.Items[0].Text;
ListBox1.Items[0].Text = temp;
index = 0;

else

&n

参考技术A 你删除了一项以后,应把ListBox1.SelectedIndex修改为新的最后一项:ListBox1.SelectedIndex=ListBox1.Items.Count-1; 参考技术B 别按索引删除 按 SelectedItem 删除
Remove方法中有一个
参考技术C protected void Button1_Click(object sender, EventArgs e)

int position = ListBox1.SelectedIndex;
string value = ListBox1.SelectedItem.Value;
if (position == 0)

return;

else

ListBox1.Items.RemoveAt(position);
ListBox1.Items.Insert(position - 1, value);



protected void Button2_Click(object sender, EventArgs e)

int position = ListBox1.SelectedIndex;
string value = ListBox1.SelectedItem.Value;
if (position == ListBox1.Items.Count-1)

return;

else

ListBox1.Items.RemoveAt(position);
ListBox1.Items.Insert(position + 1, value);


protected void Button3_Click(object sender, EventArgs e)

ListBox1.Items.RemoveAt(ListBox1.SelectedIndex);

请问你的其它方法是怎么写的?能给出来看一下么?追问

大哥,代码我补出来了,能不能帮看看!!可以加QQ说哈不嘛!万分感谢啊 !!

本回答被提问者采纳
参考技术D 建议你从后往前删除,这样就不会有问题了。

加载 WPF 时在 ListBox 中设置选定项的样式

【中文标题】加载 WPF 时在 ListBox 中设置选定项的样式【英文标题】:Style SelectedItem in ListBox upon Load WPF 【发布时间】:2022-01-02 01:38:09 【问题描述】:

我有一个ListBox,例如:

<ListBox
    //other stuff
    ItemsSource="Binding ViewModels, UpdateSourceTrigger=PropertyChanged"
    SelectedItem="Binding SelectedThing, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay">
    <ListBox.ItemContainerStyle>
          <Style TargetType="ListBoxItem"> 
                <Style.Triggers>
                       <Trigger Property="IsSelected" Value="True">
                             <Setter Property="Background" Value="Purple" />
                       </Trigger>
                </Style.Triggers>
          </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

ViewModel.cs:

public SomeType SelectedThing

     get => selectedThing;
     set => //set with INotifyPropertyChanged


public ObservableCollection<SomeType> ViewModels

     get => viewModels;
     set => //set with INotifyPropertyChanged

加载应用程序时SelectedThing 可能在ViewModel 中定义,因此我希望对其进行相应的样式设置。

当我打开应用然后点击一个项目时效果很好,但是如何在加载时应用样式?

我试过了:

<Style.Triggers>
      <DataTrigger Binding="Binding IsEnabled, RelativeSource=RelativeSource Mode=Self" Value="True">
            <Setter Property="Background" Value="Purple" />
      </DataTrigger>
</Style.Triggers>

ListBox 的每个项目都已启用,因此它会在加载时将其应用于每个项目。

编辑:

经过一番调试,我发现在加载时设置SelectedThingSelectedItem仍然是null

编辑:

这是ViewModel 中的OnLoaded 方法,如果用户在之前使用该应用程序时选择了它,我将在其中设置SelectedThing。目的是在关闭和重新打开应用后保留选择。

public IAsyncRelayCommand OnLoadedCommand  get; set; 

在构造函数中:

OnLoadedCommand = new AsyncRelayCommand(OnLoaded);

在视图中:

<b:Interaction.Triggers>
    <b:EventTrigger EventName="Loaded">
        <b:InvokeCommandAction Command="Binding OnLoadedCommand" />
    </b:EventTrigger>
</b:Interaction.Triggers>

实际方法:

public async Task OnLoaded()

    //other stuff
    if (App.Current.Properties.Contains(nameof(SelectedThing)))
    
          var selected = JsonConvert.DeserializeObject<SomeType>(App.Current.Properties[nameof(SelectedThing)].ToString());
          SelectedThing = selected;
    

【问题讨论】:

如果您设置了SelectedThingSelectedItem 未设置,您的绑定不起作用或者您没有正确实现INotifyPropertyChanged。根据您发布的代码不可能说。这不是一个可重复的例子。 SelectedItem 在单击 ListBox 中的项目后设置并且行为正确 -> 绑定确实有效。正如我在代码中所示,我也在实现INotifyPropertyChanged。问题是 SelectedThing 可以在 ViewModel 的 OnLoaded 方法中设置,这样,SelectedItem 没有设置。 是的,如果您提出更改通知,它应该是。同样,您没有显示代码的所有相关部分。为什么以及如何在OnLoaded 中设置视图模型属性? 我已经用更相关的东西更新了代码,谢谢。 selected 真的存在于源集合中吗? 【参考方案1】:

没有选择项目的原因是因为您将SelectedThing 源属性设置为不在ViewModels 源集合中的值。

正如您已经发现的那样,这样效果更好:

var selectedViewModel = ViewModels.Where(x => x.SelectedThing == selected.SelectedThing).FirstOrDefault();
SelectedThing = selectedViewModel;

要选择的项目必须存在于源集合中。

【讨论】:

以上是关于listbox里面项的删除方法的主要内容,如果未能解决你的问题,请参考以下文章

加载 WPF 时在 ListBox 中设置选定项的样式

c#中listbox选定指定项的事件

VBA中如何使用ListBox控件呢?

WPF Listbox Item:设置第一项的前景色

将ListBox选择更改为切换选择的最佳方法

怎样让listbox里面的文字自动换行