/// <summary>
        /// 在INI文件中,删除指定节点中的所有内容。
        /// </summary>
        /// <param name="iniFile">INI文件</param>
        /// <param name="section">节点</param>
        /// <returns>操作是否成功</returns>
        public static bool INIEmptySection(string iniFile, string section)
        {
            if (string.IsNullOrEmpty(section))
            {
                throw new ArgumentException("必须指定节点名称", "section");
            }

            return(INIOperationClass.WritePrivateProfileSection(section, string.Empty, iniFile));
        }
        /// <summary>
        /// 在INI文件中,将指定的键值对写到指定的节点,如果已经存在则替换
        /// </summary>
        /// <param name="iniFile">INI文件</param>
        /// <param name="section">节点,如果不存在此节点,则创建此节点</param>
        /// <param name="items">键值对,多个用\0分隔,形如key1=value1\0key2=value2</param>
        /// <returns></returns>
        public static bool INIWriteItems(string iniFile, string section, string items)
        {
            if (string.IsNullOrEmpty(section))
            {
                throw new ArgumentException("必须指定节点名称", "section");
            }

            if (string.IsNullOrEmpty(items))
            {
                throw new ArgumentException("必须指定键值对", "items");
            }

            return(INIOperationClass.WritePrivateProfileSection(section, items, iniFile));
        }
        /// <summary>
        /// 在INI文件中,删除指定节点中的指定的键。
        /// </summary>
        /// <param name="iniFile">INI文件</param>
        /// <param name="section">节点</param>
        /// <param name="key">键</param>
        /// <returns>操作是否成功</returns>
        public static bool INIDeleteKey(string iniFile, string section, string key)
        {
            if (string.IsNullOrEmpty(section))
            {
                throw new ArgumentException("必须指定节点名称", "section");
            }

            if (string.IsNullOrEmpty(key))
            {
                throw new ArgumentException("必须指定键名称", "key");
            }

            return(INIOperationClass.WritePrivateProfileString(section, key, null, iniFile));
        }
        /// <summary>
        /// 在INI文件中,指定节点写入指定的键及值。如果已经存在,则替换。如果没有则创建。
        /// </summary>
        /// <param name="iniFile">INI文件</param>
        /// <param name="section">节点</param>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        /// <returns>操作是否成功</returns>
        public static bool INIWriteValue(string iniFile, string section, string key, string value)
        {
            if (string.IsNullOrEmpty(section))
            {
                throw new ArgumentException("必须指定节点名称", "section");
            }

            if (string.IsNullOrEmpty(key))
            {
                throw new ArgumentException("必须指定键名称", "key");
            }

            if (value == null)
            {
                throw new ArgumentException("值不能为null", "value");
            }

            return(INIOperationClass.WritePrivateProfileString(section, key, value, iniFile));
        }
        /// <summary>
        /// 获取INI文件中指定节点(Section)中的所有条目的Key列表
        /// </summary>
        /// <param name="iniFile">Ini文件</param>
        /// <param name="section">节点名称</param>
        /// <returns>如果没有内容,反回string[0]</returns>
        public static string[] INIGetAllItemKeys(string iniFile, string section)
        {
            string[]  value = new string[0];
            const int SIZE  = 1024 * 10;

            if (string.IsNullOrEmpty(section))
            {
                throw new ArgumentException("必须指定节点名称", "section");
            }

            char[] chars         = new char[SIZE];
            uint   bytesReturned = INIOperationClass.GetPrivateProfileString(section, null, null, chars, SIZE, iniFile);

            if (bytesReturned != 0)
            {
                value = new string(chars).Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
            }
            chars = null;

            return(value);
        }
        /// <summary>
        /// 获取INI文件中指定节点(Section)中的所有条目(key=value形式)
        /// </summary>
        /// <param name="iniFile">Ini文件</param>
        /// <param name="section">节点名称</param>
        /// <returns>指定节点中的所有项目,没有内容返回string[0]</returns>
        public static string[] INIGetAllItems(string iniFile, string section)
        {
            //返回值形式为 key=value,例如 Color=Red
            uint MAX_BUFFER = 32767;        //默认为32767

            string[] items = new string[0]; //返回值

            //分配内存
            IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER * sizeof(char));

            uint bytesReturned = INIOperationClass.GetPrivateProfileSection(section, pReturnedString, MAX_BUFFER, iniFile);

            if (!(bytesReturned == MAX_BUFFER - 2) || (bytesReturned == 0))
            {
                string returnedString = Marshal.PtrToStringAuto(pReturnedString, (int)bytesReturned);
                items = returnedString.Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
            }

            Marshal.FreeCoTaskMem(pReturnedString);     //释放内存

            return(items);
        }
        /// <summary>
        /// 读取INI文件中指定INI文件中的所有节点名称(Section)
        /// </summary>
        /// <param name="iniFile">Ini文件</param>
        /// <returns>所有节点,没有内容返回string[0]</returns>
        public static string[] INIGetAllSectionNames(string iniFile)
        {
            uint MAX_BUFFER = 32767;           //默认为32767

            string[] sections = new string[0]; //返回值

            //申请内存
            IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER * sizeof(char));
            uint   bytesReturned   = INIOperationClass.GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, iniFile);

            if (bytesReturned != 0)
            {
                //读取指定内存的内容
                string local = Marshal.PtrToStringAuto(pReturnedString, (int)bytesReturned).ToString();

                //每个节点之间用\0分隔,末尾有一个\0
                sections = local.Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
            }

            //释放内存
            Marshal.FreeCoTaskMem(pReturnedString);

            return(sections);
        }
        /// <summary>
        /// 在配置文件中读取门限值
        /// </summary>
        private void GetErrorDataIndex()
        {
            string threshold_str = INIOperationClass.INIGetStringValue(@"e:\TRTWork\ExeceCamer\ExeceCamera\ExeceCamera\threshold.ini", "threshold", " threshold_start", "0");
            double threshold     = Convert.ToDouble(threshold_str);//限制系数

            double k = threshold;

            string R_G_1_up   = string.Empty; //保存上限
            string R_G_1_down = string.Empty; //保存下限

            string B_G_1_up   = string.Empty; //保存上限
            string B_G_1_down = string.Empty; //保存下限

            string R_G_0_up   = string.Empty; //保存上限
            string R_G_0_down = string.Empty; //保存下限

            string B_G_0_up   = string.Empty; //保存上限
            string B_G_0_down = string.Empty; //保存下限

            int[] indexs_Lens0;               //存储说有超标下标
            int[] indexs_Lens1;

            List <int> indexs_count       = new List <int>();
            List <int> indexs_count_Lens1 = new List <int>();

            for (int i = 0; i < 24; i++)
            {
                double[] d_ = HelpMethod.GetDataCateDouble(dt, naem_r_g[i], "Lens0");
                HelpMethod.GetErrorDataIndex(d_, k, out indexs_Lens0);
                indexs_count.AddRange(indexs_Lens0);

                double[] d_Lens1 = HelpMethod.GetDataCateDouble(dt, naem_r_g[i], "Lens1");
                HelpMethod.GetErrorDataIndex(d_Lens1, k, out indexs_Lens1);
                indexs_count_Lens1.AddRange(indexs_Lens1);
            }
            indexs_Lens0 = indexs_count.Distinct().ToArray();
            if (indexs_Lens0.Count() != 0)
            {
                DataRow   row;
                DataTable errorData_dt = new DataTable("errorData");
                errorData_dt.Columns.Add("Filename");
                errorData_dt.Columns.Add("ID");



                //添加选择框
                DataGridViewCheckBoxColumn newColumn = new DataGridViewCheckBoxColumn();
                newColumn.HeaderText = "√表示可以通过";
                newColumn.Name       = "IsCheck";
                dataGridView1.Columns.Add(newColumn);

                for (int i = 0; i < indexs_Lens0.Count(); i++)
                {
                    row             = errorData_dt.NewRow();
                    row["ID"]       = indexs_Lens0[i];
                    row["Filename"] = dt.Rows[indexs_Lens0[i]]["Filename"];
                    errorData_dt.Rows.Add(row);
                }
                dataGridView1.DataSource = errorData_dt;
                dataGridView1.Visible    = true;

                int   indexs;
                int[] id;
                id = GetRowChecked(out indexs);

                //foreach (var item in id)
                //{
                //   double dd= Convert.ToDouble(dt.Rows[item][""]);
                //}
            }
        }