从数组中删除 List selectedItem?
Delete List selectedItem from the array?
我有一个在程序启动时读取的文本文件,它填充了一个简单的数组。该数组然后用于填充列表框。现在我要做的是让用户 select 列表框中的一个项目并将其删除。当项目被删除时,数组应该相应更新并且列表框应该再次填充新数组(我有一个函数)。
这是我用来填充数组的内容:
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!");
}
}
这是我创建的自定义函数,用于在我进行任何更新时将数据显示到列表框中。
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();
}
class 确实被删除了,但是随着 displayClasses() 它又回来了,这意味着它没有从数组中删除。
在评论中,我猜你想问我们两个不同的问题:
- 如何允许用户从
ListBox
控件中删除项目,并捕获已删除项目的索引?
实际上我现在还不打算回答这个问题,因为我们仍在研究如何执行删除。
- 如何从给定索引的数组中删除一个项目?
这个问题的最佳解决方案是使用 List<T>
而不是数组。在你的例子中,List<string>
.
不知道你是否熟悉列表,如果不熟悉,列表就像一个"mutable array."你可以相对自由地添加或删除项目。这将完成您在评论中要求的内容,因此删除索引 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
如果您由于其他原因无法使用数组,则必须自己编写 "shifting" 逻辑。如果是这样的话我可以帮你解决这个问题,否则我不会打扰你。
无论如何,列表也将清理您的阅读方法。
这可能是我在数组中执行删除操作的方式。
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;
编写另一个函数 DeleteClasses(int indexId) 以获得更好的代码模块化,它将 return 数组 Data.It 从您的 displayClasses() 方法内部调用。在它里面根据算法如下:
第 1 步:
使用参数 IndexId 删除 cArray 中的项目,我们将在调用 DeleteClasses(int indexId) 方法时发送该参数。
代码将是这样的:
cArray = cArray .Where((source, index) => index != indexId).ToArray();
return 将从中调用它的 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!");
}
}
我有一个在程序启动时读取的文本文件,它填充了一个简单的数组。该数组然后用于填充列表框。现在我要做的是让用户 select 列表框中的一个项目并将其删除。当项目被删除时,数组应该相应更新并且列表框应该再次填充新数组(我有一个函数)。
这是我用来填充数组的内容:
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!");
}
}
这是我创建的自定义函数,用于在我进行任何更新时将数据显示到列表框中。
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();
}
class 确实被删除了,但是随着 displayClasses() 它又回来了,这意味着它没有从数组中删除。
在评论中,我猜你想问我们两个不同的问题:
- 如何允许用户从
ListBox
控件中删除项目,并捕获已删除项目的索引?
实际上我现在还不打算回答这个问题,因为我们仍在研究如何执行删除。
- 如何从给定索引的数组中删除一个项目?
这个问题的最佳解决方案是使用 List<T>
而不是数组。在你的例子中,List<string>
.
不知道你是否熟悉列表,如果不熟悉,列表就像一个"mutable array."你可以相对自由地添加或删除项目。这将完成您在评论中要求的内容,因此删除索引 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
如果您由于其他原因无法使用数组,则必须自己编写 "shifting" 逻辑。如果是这样的话我可以帮你解决这个问题,否则我不会打扰你。
无论如何,列表也将清理您的阅读方法。
这可能是我在数组中执行删除操作的方式。
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;
编写另一个函数 DeleteClasses(int indexId) 以获得更好的代码模块化,它将 return 数组 Data.It 从您的 displayClasses() 方法内部调用。在它里面根据算法如下:
第 1 步: 使用参数 IndexId 删除 cArray 中的项目,我们将在调用 DeleteClasses(int indexId) 方法时发送该参数。 代码将是这样的:
cArray = cArray .Where((source, index) => index != indexId).ToArray();
return 将从中调用它的 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!");
}
}