c#中遍历&&过滤datagridview的性能问题

本文关键字:性能 问题 datagridview 过滤 遍历 | 更新日期: 2023-09-27 18:03:14

目前,我正在为我的个人项目做一个日志分析器。我的问题是,我是c#的新手,我的工具有一个性能问题。

每次设备(iOS)交互时,我从库中获得输出syslog,并将其传入输出处理程序。

public void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine, iosSyslogger form, string uuid)
    {
        string currentPath = System.Environment.CurrentDirectory;
        bool exit = false;
        if (exit == true) return;
        try
        {
            form.BeginInvoke(new Action(() =>
            {
                form.insertLogText = outLine.Data;
            }));

           using (System.IO.StreamWriter file = new System.IO.StreamWriter(currentPath + @"'syslog" + uuid + ".txt", true))
           {
             file.WriteLine(outLine.Data);
           }
        }
        catch 
        {
            return ;
        }
        //*Most of the logic for outputing the log should be dealt from this output Handler
    }

然后,我写大纲。数据到数据网格视图。我担心的是,我需要能够通过数据网格视图搜索和过滤。

目前我正在使用visibility =false搜索过滤(如果行不匹配给定的过滤器规范,我将行设置为visibility =false)

这要求程序遍历整个datagridview以检查是否满足条件。

是否有更好的方法来过滤和搜索?(当我有数千行行时,处理它至少需要20秒)下面是过滤和搜索结果函数的代码。

 private void searchResult(string term)
    {
        if (term != null)
        {
            int i = 0;
            while (i < dataGridView1.Rows.Count - 1)
            {
                if (dataGridView1.Rows[i].Cells[3] == null)
                {
                    i++;
                    continue;
                }
                if (dataGridView1.Rows[i].Visible == false)
                {
                    i++;
                    continue;
                }
                else if (dataGridView1.Rows[i].Cells[2].Value.ToString().Contains(term) || dataGridView1.Rows[i].Cells[3].Value.ToString().Contains(term) || dataGridView1.Rows[i].Cells[4].Value.ToString().Contains(term))
                {
                    string multirow = dataGridView1.Rows[i].Cells[5].Value.ToString();
                    int count = Convert.ToInt32(multirow);
                    if (count > 0)
                    {
                        int z = 0;
                        for (z = 0; z <= count; z++)
                        {
                            dataGridView1.Rows[i + z].Visible = true;
                        }
                        i = i + z;
                    }
                    else
                    {
                        dataGridView1.Rows[i].Visible = true;
                        i++;
                    }
                }
                else
                {
                    dataGridView1.Rows[i].Visible = false;
                    i++;
                }
            }
        }
    }

公共filteringThelist () {

for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
        {
            dataGridView1.Rows[i].Visible = false;
            int count1,count2,count3=0;
            count1 = 1;
            count2 = 1;
            count3 = 1;
            int z = 0;
            foreach (KeyValuePair<string, string> entry in totalSelected)
            {
                if (entry.Value == "devicename" && dataGridView1.Rows[i].Cells[1].Value != null)
                {
                    if (dataGridView1.Rows[i].Cells[1].Value.ToString().Trim().Equals(entry.Key.Trim()))
                    {
                        string multirow1 = dataGridView1.Rows[i].Cells[5].Value.ToString();
                        int counts = Convert.ToInt32(multirow1);
                        if (counts > 0)
                        {
                            for (z = 0; z < counts; z++)
                            {
                                dataGridView1.Rows[i + z].Visible = true;
                            }
                        }
                        else
                        {
                            dataGridView1.Rows[i].Visible = true;
                        }
                    }
                    else if (devicename.CheckedItems.Count > 1&&count1!= devicename.CheckedItems.Count)
                    {
                        count1++;
                        continue;
                    }
                    else
                    {
                        dataGridView1.Rows[i].Visible = false;
                        break;
                    }
                }
                else if (entry.Value == "process" && dataGridView1.Rows[i].Cells[2].Value != null)
                {
                    if (dataGridView1.Rows[i].Cells[2].Value.ToString().Trim().Equals(entry.Key.Trim()))
                    {
                        string multirow1 = dataGridView1.Rows[i].Cells[5].Value.ToString();
                        int counts = Convert.ToInt32(multirow1);
                        if (counts > 0)
                        {
                            for (z = 0; z < counts; z++)
                            {
                                dataGridView1.Rows[i + z].Visible = true;
                            }
                        }
                        else
                        {
                            dataGridView1.Rows[i].Visible = true;
                        }
                    }
                    else if (processlistname.CheckedItems.Count > 1 && count2 != processlistname.CheckedItems.Count)
                    {
                        count2++;
                        continue;
                    }
                    else 
                    {
                        dataGridView1.Rows[i].Visible = false;
                        break;
                    }
                }
                else if (entry.Value == "loglevel" && dataGridView1.Rows[i].Cells[3].Value != null)
                {
                    if (dataGridView1.Rows[i].Cells[3].Value.ToString().Trim().Contains(entry.Key.Trim()))
                    {
                        string multirow1 = dataGridView1.Rows[i].Cells[5].Value.ToString();
                        int counts = Convert.ToInt32(multirow1);
                        if (counts > 0)
                        {
                            for (z = 0; z < counts; z++)
                            {
                                dataGridView1.Rows[i + z].Visible = true;
                            }
                        }
                        else
                        {
                            dataGridView1.Rows[i].Visible = true;
                        }
                        continue;
                    }
                    else if (loglevelCheckBox.CheckedItems.Count > 1 && count3 != loglevelCheckBox.CheckedItems.Count)
                    {
                        count3++;
                        continue;
                    }
                    else
                    {
                        dataGridView1.Rows[i].Visible = false;
                        break;
                    }
                }
                // do something with entry.Value or entry.Key
            }
            string multirow = dataGridView1.Rows[i].Cells[5].Value.ToString();
            int count = Convert.ToInt32(multirow);
            if (count > 0&& dataGridView1.Rows[i].Visible==false)
            {
                for (int k = 0; k <= count; k++)
                {
                    dataGridView1.Rows[i + k].Visible = false;
                }
            }
            i = i + z;


        }

c#中遍历&&过滤datagridview的性能问题

性能问题是因为您的DataGridView在每次修改时都重绘。

不要直接从Data中填充DataGridView。而是创建一个数据表,并使用BindingSource将其绑定到DataGridView。

然后使用绑定源的"Filter"属性在DataGridView中查看dataTable的提取。"Filter"属性是一个字符串,其内容类似于WHERE SQL子句。