public DNSCryptResolverPicker(string ResolverFilename) { InitializeComponent(); ColumnSorter = new ListViewColumnSorter(); ResolverList.ListViewItemSorter = ColumnSorter; int NameColumn = -1; int FullNameColumn = -1; int URLColumn = -1; List <int> IgnoreColumnIndices = new List <int>(); var Trim = new char[] { '\"', ' ' }; var CSVSplitRegex = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))"); var NameHeader = new ColumnHeader(); NameHeader.Text = "Name"; ResolverList.Columns.Add(NameHeader); int Index = 0; string[] Lines = System.IO.File.ReadAllLines(ResolverFilename); foreach (var Line in Lines) { string[] Elements = CSVSplitRegex.Split(Line); int ElementsCount = Elements.Count(); for (int i = 0; i < ElementsCount; i++) { Elements[i] = Elements[i].Trim(Trim); } if (Index == 0) { int ColIndex = 0; foreach (string Elem in Elements) { if (Elem.Equals("Name")) { NameColumn = ColIndex; } if (Elem.Equals("Full name")) { FullNameColumn = ColIndex; } if (Elem.Equals("URL")) { URLColumn = ColIndex; } bool ShouldIgnore = false; foreach (string Ignore in IgnoreColumns) { if (Elem.StartsWith(Ignore)) { ShouldIgnore = true; IgnoreColumnIndices.Add(ColIndex); break; } } if (!ShouldIgnore) { var Header = new ColumnHeader(); Header.Text = Elem; ResolverList.Columns.Add(Header); } ColIndex++; } } else { int URLIndex = -1; int ColIndex = 0; List <string> RemainingColData = new List <string>(); foreach (string Elem in Elements) { if (ColIndex == URLColumn) { URLIndex = RemainingColData.Count; } if (IgnoreColumnIndices.IndexOf(ColIndex) == -1) { RemainingColData.Add(Elem); } ColIndex++; } var Item = new ListViewItem(); Item.Text = Elements[FullNameColumn]; int DataIndex = 0; foreach (var Data in RemainingColData) { if (DataIndex == URLIndex) { var SubItem = new ListViewItem.ListViewSubItem(); SubItem.ForeColor = Color.Blue; SubItem.Text = RemainingColData[DataIndex]; SubItem.Font = new Font(SubItem.Font, FontStyle.Underline); Item.SubItems.Add(SubItem); } else { Item.SubItems.Add(RemainingColData[DataIndex]); } DataIndex++; } Item.UseItemStyleForSubItems = false; Item.SubItems.AddRange(RemainingColData.ToArray()); Item.Tag = Elements[NameColumn]; ResolverList.Items.Add(Item); } Index++; } ResolverList.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); }