从数组中删除list selectedItem?

时间:2015-03-07 07:20:24

标签: c# arrays listbox

我有一个在程序启动时读取的文本文件,它填充了一个简单的数组。然后使用该数组填充listBox。现在我想要做的是让用户选择listBox中的一个项目并将其删除。当项目被删除时,数组应该相应地更新,并且应该再次使用新数组填充listBox(我有一个函数)。

这是我用来填充数组的内容:

string[] cArray = new string[10];
int counter, count;
public void loadArray()
{
    try
    {
        StreamReader inputfile = File.OpenText("Classes.txt");

        classList.Items.Clear();
        while (!inputfile.EndOfStream)
        {
            cArray[count] = inputfile.ReadLine();
            count++;
        }
        inputfile.Close();
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message, "Loading Error!");
    }
}

这是我在每次进行任何更新时将数据显示到listBox中的自定义函数。

public void displayClasses()
{
    try
    {
        classList.Items.Clear();
        for (counter = 0; counter < count; counter++)
        {
            classList.Items.Add(cArray[counter]);
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message, "Displaying Error!");
    }
}

我尝试使用Nirupam的回复:

private void deleteButton_Click(object sender, EventArgs e)
{
    try
    {
        while (classList.SelectedItems.Count != 0)
        {
            classList.Items.RemoveAt(classList.SelectedIndex);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    DeleteClasses(classList.SelectedIndex);
}

public void DeleteClasses(int indexId)
{
    cArray = cArray.Where((source, index) => index != indexId).ToArray();
    displayClasses();
}

该类确实被删除但是使用displayClasses()它会返回,这意味着它不会从数组中删除。

2 个答案:

答案 0 :(得分:1)

在评论中,我猜想你试图向我们提出两个不同的问题:

  1. 如何允许用户从ListBox控件中删除项目,并捕获已删除项目的索引?
  2. 我实际上还没有回答这个问题,因为我们仍在研究如何删除。

    1. 如果给出索引,如何从数组中删除项?
    2. 此问题的最佳解决方案是使用List<T>而不是数组。在您的情况下,List<string>

      我不知道你是否熟悉列表,但如果没有,列表就像一个“可变数组”。您可以相对自由地添加或删除项目。这将完成您在评论中要求的内容,因此删除索引2处的项目会将所有后续项目向下移动一个。

      要删除项目,请使用RemoveAt方法:

      List<string> strs = new List<string>();
      
      strs.Add("AAA");
      strs.Add("BBB");
      strs.Add("CCC");
      
      strs.RemoveAt(1); // remove "BBB"
      
      Console.WriteLine(strs[0]); // yields AAA
      Console.WriteLine(strs[1]); // yields CCC
      

      如果你出于其他原因而坚持使用数组,那么你必须自己编写“移位”逻辑。如果是这样的话,我可以帮助你,但我不会打扰。

      对于它的价值,列表也会清理你的阅读方法。


      这可能是我在数组中执行删除操作的方法。

      string[] args = new string[3];
      
      args[0] = "AAA";
      args[1] = "BBB";
      args[2] = "CCC";
      
      int indexToRemove = 1;
      
      for (int v = indexToRemove + 1; v < args.Length; v++)
      {
          if(v > 0)
          {
              args[v - 1] = args[v];
          }
      }
      
      args[args.Length - 1] = null;
      

答案 1 :(得分:0)

编写另一个函数DeleteClasses(int indexId)以获得更好的代码模块化,这将返回Array Data.It将从你的displayClasses()方法中调用.Inside它根据下面给出的Algo写下代码:

第1步: 使用参数IndexId删除cArray中的Item,我们将在调用DeleteClasses(int indexId)方法时发送该参数。 代码将是这样的:

cArray = cArray .Where((source, index) => index != indexId).ToArray();

从那里调用cArray。

第2步: 之后,当用户选择删除项目时,您将更新阵列。 比通过调用displayClasses()加载ListBox; 注意:在displayClasses()中,你应该有如下代码:

try{
    classList.Items.Clear();
    classList.Items = cArray.ToList(); //here cArray is updated data array
   }
  catch (Exception e)
  {
   MessageBox.Show(e.Message, "Displaying Error!");
  }

总体而言: 整体代码如下所示:

Public string[] DeleteClasses(int indexId)
{
    //indexId will be depends upon user selection on demand for delete     
    // operation.
    cArray = cArray .Where((source, index) => index != indexId).ToArray();
}
public void displayClasses()
{
   try{
        int indexId=classList.SelectedItemIndex;//
        string[] cArray = DeleteClasses(int indexId);
        classList.Items.Clear();
        classList.Items = cArray.ToList(); //here cArray is updated data array
       }
      catch (Exception e)
      {
       MessageBox.Show(e.Message, "Displaying Error!");
      }
}