C# 索引超出wpf c的范围#

C# 索引超出wpf c的范围#,c#,wpf,C#,Wpf,我有一个功能,每10秒获取一次正在运行的应用程序,将它们放在列表框中,如果单击“发送”按钮,将它们发送到另一个窗口。现在的问题是,每当我尝试打开然后立即关闭一个应用程序时,它都会发送一个指向我的列表的错误。 我不知道该怎么办 Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index. 以下是我的代码,以防它带来任何帮助: privat

我有一个功能,每10秒获取一次正在运行的应用程序,将它们放在列表框中,如果单击“发送”按钮,将它们发送到另一个窗口。现在的问题是,每当我尝试打开然后立即关闭一个应用程序时,它都会发送一个指向我的列表的错误。 我不知道该怎么办

 Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index.
以下是我的代码,以防它带来任何帮助:

private List<int> listedProcesses = new List<int>();
    private void SendData()
    {
        String processID = "";
        String processName = "";
        String processFileName = "";
        String processPath = "";
        string hostName = System.Net.Dns.GetHostName();

        listBox1.BeginUpdate();
        try
        {
            for (int i = 0; i < listBox1.Items.Count; i++)
            {
                piis = GetAllProcessInfos();
                try
                {
                    if (!listedProcesses.Contains(piis[i].Id)) //place this on a list to avoid redundancy
                    {
                        listedProcesses.Add(piis[i].Id);
                        processID = piis[i].Id.ToString();
                        processName = piis[i].Name.ToString();
                        processFileName = piis[i].FileName.ToString();
                        processPath = piis[i].Path.ToString();
                        output.Text += "\n\nSENT DATA : \n\t" + processID + "\n\t" + processName + "\n\t" + processFileName + "\n\t" + processPath + "\n";
                    }

                }
                catch (Exception ex)
                {
                   wait.Abort();
                   output.Text += "Error..... " + ex.StackTrace;
                }

                NetworkStream ns = tcpclnt.GetStream();
                String data = "";
                data = "--++" + "  " + processID + " " + processPath + " " + processFileName + " " + hostName;

                if (ns.CanWrite)
                {
                    byte[] bf = new ASCIIEncoding().GetBytes(data);
                    ns.Write(bf, 0, bf.Length);
                    ns.Flush();
                } 
            }
        }
        finally
        {
            listBox1.EndUpdate();
        } 
    }

 private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        ProcessInfoItem pii = piis.FirstOrDefault(x => x.Id == (int)(sender as ListBox).SelectedValue); //setting value for list box
        if (pii != null)
        {
            string hostName = System.Net.Dns.GetHostName();

            textBox4.Text = listBox1.SelectedValue.ToString();
            textBox5.Text = (pii.FileName);
            textBox6.Text = (pii.Path);
            textBox7.Text = hostName;
        }
    }

    private List<ProcessInfoItem> piis = new List<ProcessInfoItem>();
    private void Form1_Load(object sender, EventArgs e)
    {
        piis = GetAllProcessInfos();
        listBox1.DisplayMember = "Name";
        listBox1.ValueMember = "Id";
        listBox1.DataSource = piis;
        textBox1.Text = GetIpAdd().ToString();
    }
    private List<ProcessInfoItem> GetAllProcessInfos()
    {

        List<ProcessInfoItem> result = new List<ProcessInfoItem>();
        Process currentProcess = Process.GetCurrentProcess();
        Process[] processes = Process.GetProcesses();
        foreach (Process p in processes)
        {
            if (!String.IsNullOrEmpty(p.MainWindowTitle))
            {
                ProcessInfoItem pii = new ProcessInfoItem(p.Id,p.MainModule.ModuleName, p.MainWindowTitle, p.MainModule.FileName);
                result.Add(pii);
            }
        }
        return result;
    } 
    public class ProcessInfoItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string FileName { get; set; }
        public string Path { get; set; }
        public ProcessInfoItem(int id, string name, string filename, string path)
        {
            this.Id = id;
            this.Name = name;
            this.FileName = filename;
            this.Path = path;
        }
    }
private List listedProcesses=new List();
私有void SendData()
{
字符串processID=“”;
字符串processName=“”;
字符串processFileName=“”;
字符串processPath=“”;
字符串hostName=System.Net.Dns.GetHostName();
listBox1.BeginUpdate();
尝试
{
对于(int i=0;i++++++++++processID++++processPath++++++processFileName++hostName;
如果(ns.CanWrite)
{
byte[]bf=新的AscienceODing().GetBytes(数据);
ns.写入(bf,0,bf.长度);
ns.Flush();
} 
}
}
最后
{
listBox1.EndUpdate();
} 
}
私有无效列表框1\u SelectedIndexChanged(对象发送方,事件参数e)
{
ProcessInfoItem pii=piis.FirstOrDefault(x=>x.Id==(int)(发送方为ListBox.SelectedValue);//设置列表框的值
如果(pii!=null)
{
字符串hostName=System.Net.Dns.GetHostName();
textBox4.Text=listBox1.SelectedValue.ToString();
textBox5.Text=(pii.FileName);
textBox6.Text=(pii.Path);
textBox7.Text=主机名;
}
}
私有列表piis=新列表();
私有void Form1\u加载(对象发送方、事件参数e)
{
piis=GetAllProcessInfos();
listBox1.DisplayMember=“Name”;
listBox1.ValueMember=“Id”;
listBox1.DataSource=piis;
textBox1.Text=GetIpAdd().ToString();
}
私有列表GetAllProcessInfos()
{
列表结果=新列表();
Process currentProcess=Process.GetCurrentProcess();
Process[]processs=Process.getprocesss();
foreach(进程中的进程p)
{
如果(!String.IsNullOrEmpty(p.MainWindowTitle))
{
ProcessInfoItem pii=新的ProcessInfoItem(p.Id、p.MainModule.ModuleName、p.MainWindowTitle、p.MainModule.FileName);
结果:添加(pii);
}
}
返回结果;
} 
公共类ProcessInfoItem
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串文件名{get;set;}
公共字符串路径{get;set;}
公共ProcessInfoItem(int id、字符串名称、字符串文件名、字符串路径)
{
这个.Id=Id;
this.Name=Name;
this.FileName=文件名;
this.Path=Path;
}
}

您正在为您的
for
循环引用的不同集合编制索引。听起来你可能想要:

piis = GetAllProcessInfos();
for (int i = 0; i < piis.Count; i++)
{
piis=GetAllProcessInfos();
对于(int i=0;i

相反。但是,您正在
for
循环中调用该函数表单,因此不清楚应该迭代什么。

您正在为
for
循环引用的不同集合编制索引。听起来您可能需要:

piis = GetAllProcessInfos();
for (int i = 0; i < piis.Count; i++)
{
piis=GetAllProcessInfos();
对于(int i=0;i
但是,您在
for
循环中调用该函数表单,因此不清楚应该迭代什么。

尝试更改

 for (int i = 0; i < listBox1.Items.Count; i++)
        {
            piis = GetAllProcessInfos();
for(int i=0;i

piis=GetAllProcessInfos();
对于(int i=0;i
尝试更改

 for (int i = 0; i < listBox1.Items.Count; i++)
        {
            piis = GetAllProcessInfos();
for(int i=0;i

piis=GetAllProcessInfos();
对于(int i=0;i
它应该是“listBox1.Items.Count-1”在你的loop@KarthikGanesanOP正在使用
为什么您认为
piis
上限不大于
列表框1.Items.Count
听起来像
GetAllProcessInfos
返回的项目数与
列表框1.Items.Count
不同。谢谢您的快速响应,先生。我知道这听起来可能很愚蠢I don’你能告诉我为什么吗?应该是“listBox1.Items.Count-1”在你的loop@KarthikGanesanOP正在使用
为什么您认为
piis
上限不大于
列表框1.Items.Count
听起来像
GetAllProcessInfos
返回的项目数与
列表框1.Items.Count
不同。谢谢您的快速响应,先生。我知道这听起来可能很愚蠢你不能指出吗