自定义列表框排序

我需要对包含在多个列表框中的数据进行排序。 用户将能够使用无线电盒在两种不同类型的排序之间进行选择,其中一种默认情况下在表格加载时进行检查。 我已经创建了所需的IF语句,以便测试该单选按钮的检查条件是否为真。 但我需要一些帮助来创建自定义排序算法。

每个列表包含相似的查看数据,每行开始的唯一区别。 例如,第一个列表框中的每一行以前缀“G30”开头,第二个列表框将以“G31”开头,依此类推。 总共有10个列表框(就前缀而言为G30-G39)。

第一个搜索算法必须按前13个字符的数字顺序对行进行排序。

示例:这是排序前数据的外观

G35:45:58:11 JG07 G35:45:20:41 JG01 G35:58:20:21 JG03 G35:66:22:20 JG05 G35:45:85:21 JG02 G35:64:56:11 JG03 G35:76:35:11 JG02 G35:77:97:12 JG03 G35:54:29:11 JG01 G35:55:51:20 JG01 G35:76:24:20 JG06 G35:76:55:11 JG01 

这就是排序后应该如何看待

 G35:45:20:41 JG01 G35:45:58:11 JG07 G35:45:85:21 JG02 G35:54:29:11 JG01 G35:55:51:20 JG01 G35:58:20:21 JG03 G35:64:56:11 JG03 G35:66:22:20 JG05 G35:76:24:20 JG06 G35:76:35:11 JG02 G35:76:55:11 JG01 G35:77:97:12 JG03 

如您所见,前缀是相同的。 因此它被排序,最低,首先是下一对整数,然后是下一对和下一对,而不是“JG”之后的值。

第二种排序算法将忽略前13个字符并按“JG”之后的值的顺序排序,最高的第一个。

任何帮助? theres一些代表给你:)

提前致谢

编辑

 namespace Jumpgate_Network_Program { partial class ViewForm { ///  /// Required designer variable. ///  private System.ComponentModel.IContainer components = null; ///  /// Clean up any resources being used. ///  /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code ///  /// Required method for Designer support - do not modify /// the contents of this method with the code editor. ///  private void InitializeComponent() { this.tabconSubsectors = new System.Windows.Forms.TabControl(); this.tabG30 = new System.Windows.Forms.TabPage(); this.lstG30 = new System.Windows.Forms.ListBox(); this.tabG31 = new System.Windows.Forms.TabPage(); this.lstG31 = new System.Windows.Forms.ListBox(); this.tabG32 = new System.Windows.Forms.TabPage(); this.lstG32 = new System.Windows.Forms.ListBox(); this.tabG33 = new System.Windows.Forms.TabPage(); this.lstG33 = new System.Windows.Forms.ListBox(); this.tabG34 = new System.Windows.Forms.TabPage(); this.lstG34 = new System.Windows.Forms.ListBox(); this.tabG35 = new System.Windows.Forms.TabPage(); this.lstG35 = new System.Windows.Forms.ListBox(); this.tabG36 = new System.Windows.Forms.TabPage(); this.lstG36 = new System.Windows.Forms.ListBox(); this.tabG37 = new System.Windows.Forms.TabPage(); this.lstG37 = new System.Windows.Forms.ListBox(); this.tabG38 = new System.Windows.Forms.TabPage(); this.lstG38 = new System.Windows.Forms.ListBox(); this.tabG39 = new System.Windows.Forms.TabPage(); this.lstG39 = new System.Windows.Forms.ListBox(); this.tabSearch = new System.Windows.Forms.TabPage(); this.btnSearch = new System.Windows.Forms.Button(); this.txtSearch = new System.Windows.Forms.TextBox(); this.lstResult = new System.Windows.Forms.ListBox(); this.label1 = new System.Windows.Forms.Label(); this.grpOptions = new System.Windows.Forms.GroupBox(); this.rbtnHighest = new System.Windows.Forms.RadioButton(); this.rbtnCoord = new System.Windows.Forms.RadioButton(); this.tabconSubsectors.SuspendLayout(); this.tabG30.SuspendLayout(); this.tabG31.SuspendLayout(); this.tabG32.SuspendLayout(); this.tabG33.SuspendLayout(); this.tabG34.SuspendLayout(); this.tabG35.SuspendLayout(); this.tabG36.SuspendLayout(); this.tabG37.SuspendLayout(); this.tabG38.SuspendLayout(); this.tabG39.SuspendLayout(); this.tabSearch.SuspendLayout(); this.grpOptions.SuspendLayout(); this.SuspendLayout(); // // tabconSubsectors // this.tabconSubsectors.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tabconSubsectors.Controls.Add(this.tabG30); this.tabconSubsectors.Controls.Add(this.tabG31); this.tabconSubsectors.Controls.Add(this.tabG32); this.tabconSubsectors.Controls.Add(this.tabG33); this.tabconSubsectors.Controls.Add(this.tabG34); this.tabconSubsectors.Controls.Add(this.tabG35); this.tabconSubsectors.Controls.Add(this.tabG36); this.tabconSubsectors.Controls.Add(this.tabG37); this.tabconSubsectors.Controls.Add(this.tabG38); this.tabconSubsectors.Controls.Add(this.tabG39); this.tabconSubsectors.Controls.Add(this.tabSearch); this.tabconSubsectors.Location = new System.Drawing.Point(13, 39); this.tabconSubsectors.Name = "tabconSubsectors"; this.tabconSubsectors.SelectedIndex = 0; this.tabconSubsectors.Size = new System.Drawing.Size(282, 305); this.tabconSubsectors.TabIndex = 0; // // tabG30 // this.tabG30.Controls.Add(this.lstG30); this.tabG30.Location = new System.Drawing.Point(4, 22); this.tabG30.Name = "tabG30"; this.tabG30.Padding = new System.Windows.Forms.Padding(3); this.tabG30.Size = new System.Drawing.Size(274, 279); this.tabG30.TabIndex = 0; this.tabG30.Text = "G30"; this.tabG30.UseVisualStyleBackColor = true; // // lstG30 // this.lstG30.FormattingEnabled = true; this.lstG30.Location = new System.Drawing.Point(7, 7); this.lstG30.Name = "lstG30"; this.lstG30.Size = new System.Drawing.Size(259, 264); this.lstG30.TabIndex = 0; // // tabG31 // this.tabG31.Controls.Add(this.lstG31); this.tabG31.Location = new System.Drawing.Point(4, 22); this.tabG31.Name = "tabG31"; this.tabG31.Padding = new System.Windows.Forms.Padding(3); this.tabG31.Size = new System.Drawing.Size(274, 279); this.tabG31.TabIndex = 1; this.tabG31.Text = "G31"; this.tabG31.UseVisualStyleBackColor = true; // // lstG31 // this.lstG31.FormattingEnabled = true; this.lstG31.Location = new System.Drawing.Point(8, 7); this.lstG31.Name = "lstG31"; this.lstG31.Size = new System.Drawing.Size(259, 264); this.lstG31.TabIndex = 1; // // tabG32 // this.tabG32.Controls.Add(this.lstG32); this.tabG32.Location = new System.Drawing.Point(4, 22); this.tabG32.Name = "tabG32"; this.tabG32.Padding = new System.Windows.Forms.Padding(3); this.tabG32.Size = new System.Drawing.Size(274, 279); this.tabG32.TabIndex = 2; this.tabG32.Text = "G32"; this.tabG32.UseVisualStyleBackColor = true; // // lstG32 // this.lstG32.FormattingEnabled = true; this.lstG32.Location = new System.Drawing.Point(8, 7); this.lstG32.Name = "lstG32"; this.lstG32.Size = new System.Drawing.Size(259, 264); this.lstG32.TabIndex = 1; // // tabG33 // this.tabG33.Controls.Add(this.lstG33); this.tabG33.Location = new System.Drawing.Point(4, 22); this.tabG33.Name = "tabG33"; this.tabG33.Padding = new System.Windows.Forms.Padding(3); this.tabG33.Size = new System.Drawing.Size(274, 279); this.tabG33.TabIndex = 3; this.tabG33.Text = "G33"; this.tabG33.UseVisualStyleBackColor = true; // // lstG33 // this.lstG33.FormattingEnabled = true; this.lstG33.Location = new System.Drawing.Point(8, 7); this.lstG33.Name = "lstG33"; this.lstG33.Size = new System.Drawing.Size(259, 264); this.lstG33.TabIndex = 1; // // tabG34 // this.tabG34.Controls.Add(this.lstG34); this.tabG34.Location = new System.Drawing.Point(4, 22); this.tabG34.Name = "tabG34"; this.tabG34.Padding = new System.Windows.Forms.Padding(3); this.tabG34.Size = new System.Drawing.Size(274, 279); this.tabG34.TabIndex = 4; this.tabG34.Text = "G34"; this.tabG34.UseVisualStyleBackColor = true; // // lstG34 // this.lstG34.FormattingEnabled = true; this.lstG34.Location = new System.Drawing.Point(8, 7); this.lstG34.Name = "lstG34"; this.lstG34.Size = new System.Drawing.Size(259, 264); this.lstG34.TabIndex = 1; // // tabG35 // this.tabG35.Controls.Add(this.lstG35); this.tabG35.Location = new System.Drawing.Point(4, 22); this.tabG35.Name = "tabG35"; this.tabG35.Padding = new System.Windows.Forms.Padding(3); this.tabG35.Size = new System.Drawing.Size(274, 279); this.tabG35.TabIndex = 5; this.tabG35.Text = "G35"; this.tabG35.UseVisualStyleBackColor = true; // // lstG35 // this.lstG35.FormattingEnabled = true; this.lstG35.Location = new System.Drawing.Point(8, 7); this.lstG35.Name = "lstG35"; this.lstG35.Size = new System.Drawing.Size(259, 264); this.lstG35.TabIndex = 1; // // tabG36 // this.tabG36.Controls.Add(this.lstG36); this.tabG36.Location = new System.Drawing.Point(4, 22); this.tabG36.Name = "tabG36"; this.tabG36.Padding = new System.Windows.Forms.Padding(3); this.tabG36.Size = new System.Drawing.Size(274, 279); this.tabG36.TabIndex = 6; this.tabG36.Text = "G36"; this.tabG36.UseVisualStyleBackColor = true; // // lstG36 // this.lstG36.FormattingEnabled = true; this.lstG36.Location = new System.Drawing.Point(8, 7); this.lstG36.Name = "lstG36"; this.lstG36.Size = new System.Drawing.Size(259, 264); this.lstG36.TabIndex = 1; // // tabG37 // this.tabG37.Controls.Add(this.lstG37); this.tabG37.Location = new System.Drawing.Point(4, 22); this.tabG37.Name = "tabG37"; this.tabG37.Padding = new System.Windows.Forms.Padding(3); this.tabG37.Size = new System.Drawing.Size(274, 279); this.tabG37.TabIndex = 7; this.tabG37.Text = "G37"; this.tabG37.UseVisualStyleBackColor = true; // // lstG37 // this.lstG37.FormattingEnabled = true; this.lstG37.Location = new System.Drawing.Point(8, 7); this.lstG37.Name = "lstG37"; this.lstG37.Size = new System.Drawing.Size(259, 264); this.lstG37.TabIndex = 1; // // tabG38 // this.tabG38.Controls.Add(this.lstG38); this.tabG38.Location = new System.Drawing.Point(4, 22); this.tabG38.Name = "tabG38"; this.tabG38.Padding = new System.Windows.Forms.Padding(3); this.tabG38.Size = new System.Drawing.Size(274, 279); this.tabG38.TabIndex = 8; this.tabG38.Text = "G38"; this.tabG38.UseVisualStyleBackColor = true; // // lstG38 // this.lstG38.FormattingEnabled = true; this.lstG38.Location = new System.Drawing.Point(8, 7); this.lstG38.Name = "lstG38"; this.lstG38.Size = new System.Drawing.Size(259, 264); this.lstG38.TabIndex = 1; // // tabG39 // this.tabG39.Controls.Add(this.lstG39); this.tabG39.Location = new System.Drawing.Point(4, 22); this.tabG39.Name = "tabG39"; this.tabG39.Padding = new System.Windows.Forms.Padding(3); this.tabG39.Size = new System.Drawing.Size(274, 279); this.tabG39.TabIndex = 9; this.tabG39.Text = "G39"; this.tabG39.UseVisualStyleBackColor = true; // // lstG39 // this.lstG39.FormattingEnabled = true; this.lstG39.Location = new System.Drawing.Point(8, 7); this.lstG39.Name = "lstG39"; this.lstG39.Size = new System.Drawing.Size(259, 264); this.lstG39.TabIndex = 1; // // tabSearch // this.tabSearch.Controls.Add(this.btnSearch); this.tabSearch.Controls.Add(this.txtSearch); this.tabSearch.Controls.Add(this.lstResult); this.tabSearch.Location = new System.Drawing.Point(4, 22); this.tabSearch.Name = "tabSearch"; this.tabSearch.Padding = new System.Windows.Forms.Padding(3); this.tabSearch.Size = new System.Drawing.Size(274, 279); this.tabSearch.TabIndex = 10; this.tabSearch.Text = "Search"; this.tabSearch.UseVisualStyleBackColor = true; // // btnSearch // this.btnSearch.Location = new System.Drawing.Point(150, 47); this.btnSearch.Name = "btnSearch"; this.btnSearch.Size = new System.Drawing.Size(75, 19); this.btnSearch.TabIndex = 3; this.btnSearch.Text = "Search"; this.btnSearch.UseVisualStyleBackColor = true; // // txtSearch // this.txtSearch.Location = new System.Drawing.Point(8, 46); this.txtSearch.Name = "txtSearch"; this.txtSearch.Size = new System.Drawing.Size(136, 20); this.txtSearch.TabIndex = 2; // // lstResult // this.lstResult.FormattingEnabled = true; this.lstResult.Location = new System.Drawing.Point(8, 72); this.lstResult.Name = "lstResult"; this.lstResult.Size = new System.Drawing.Size(259, 199); this.lstResult.TabIndex = 1; // // label1 // this.label1.AutoSize = true; this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F); this.label1.Location = new System.Drawing.Point(13, 13); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(131, 20); this.label1.TabIndex = 1; this.label1.Text = "Select Subsector"; // // grpOptions // this.grpOptions.Controls.Add(this.rbtnHighest); this.grpOptions.Controls.Add(this.rbtnCoord); this.grpOptions.Location = new System.Drawing.Point(301, 68); this.grpOptions.Name = "grpOptions"; this.grpOptions.Size = new System.Drawing.Size(101, 72); this.grpOptions.TabIndex = 2; this.grpOptions.TabStop = false; this.grpOptions.Text = "Sort by"; // // rbtnHighest // this.rbtnHighest.AutoSize = true; this.rbtnHighest.Location = new System.Drawing.Point(7, 44); this.rbtnHighest.Name = "rbtnHighest"; this.rbtnHighest.Size = new System.Drawing.Size(90, 17); this.rbtnHighest.TabIndex = 1; this.rbtnHighest.Text = "Highest Level"; this.rbtnHighest.UseVisualStyleBackColor = true; this.rbtnHighest.CheckedChanged += new System.EventHandler(this.rbtnHighest_CheckedChanged); // // rbtnCoord // this.rbtnCoord.AutoSize = true; this.rbtnCoord.Checked = true; this.rbtnCoord.Location = new System.Drawing.Point(7, 20); this.rbtnCoord.Name = "rbtnCoord"; this.rbtnCoord.Size = new System.Drawing.Size(84, 17); this.rbtnCoord.TabIndex = 0; this.rbtnCoord.TabStop = true; this.rbtnCoord.Text = "Co-ordinates"; this.rbtnCoord.UseVisualStyleBackColor = true; this.rbtnCoord.CheckedChanged += new System.EventHandler(this.rbtnCoord_CheckedChanged); // // ViewForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(408, 356); this.Controls.Add(this.grpOptions); this.Controls.Add(this.label1); this.Controls.Add(this.tabconSubsectors); this.MaximizeBox = false; this.Name = "ViewForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "View Jumpgates - JNP"; this.Load += new System.EventHandler(this.ViewForm_Load); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ViewForm_FormClosing); this.tabconSubsectors.ResumeLayout(false); this.tabG30.ResumeLayout(false); this.tabG31.ResumeLayout(false); this.tabG32.ResumeLayout(false); this.tabG33.ResumeLayout(false); this.tabG34.ResumeLayout(false); this.tabG35.ResumeLayout(false); this.tabG36.ResumeLayout(false); this.tabG37.ResumeLayout(false); this.tabG38.ResumeLayout(false); this.tabG39.ResumeLayout(false); this.tabSearch.ResumeLayout(false); this.tabSearch.PerformLayout(); this.grpOptions.ResumeLayout(false); this.grpOptions.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TabControl tabconSubsectors; private System.Windows.Forms.TabPage tabG30; private System.Windows.Forms.TabPage tabG31; private System.Windows.Forms.Label label1; private System.Windows.Forms.TabPage tabG32; private System.Windows.Forms.TabPage tabG33; private System.Windows.Forms.TabPage tabG34; private System.Windows.Forms.TabPage tabG35; private System.Windows.Forms.TabPage tabG36; private System.Windows.Forms.TabPage tabG37; private System.Windows.Forms.TabPage tabG38; private System.Windows.Forms.TabPage tabG39; private System.Windows.Forms.TabPage tabSearch; private System.Windows.Forms.CustomListBox lstG30; private System.Windows.Forms.GroupBox grpOptions; private System.Windows.Forms.RadioButton rbtnHighest; private System.Windows.Forms.RadioButton rbtnCoord; private System.Windows.Forms.CustomListBox lstG31; private System.Windows.Forms.CustomListBox lstG32; private System.Windows.Forms.CustomListBox lstG33; private System.Windows.Forms.CustomListBox lstG34; private System.Windows.Forms.CustomListBox lstG35; private System.Windows.Forms.CustomListBox lstG36; private System.Windows.Forms.CustomListBox lstG37; private System.Windows.Forms.CustomListBox lstG38; private System.Windows.Forms.CustomListBox lstG39; private System.Windows.Forms.Button btnSearch; private System.Windows.Forms.TextBox txtSearch; private System.Windows.Forms.ListBox lstResult; } 

}

要更改ListBox的排序行为,必须实现自己的ListBox类。 我已经为你编写了解决方案并进行了测试。

右键单击您的项目,选择“Add Class …”并输入类名“CustomListBox”。 将以下代码添加到命名空间之间的类中:

 using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; // You need this namespace for ListBox public class CustomListBox : ListBox { public CustomListBox() : base() { } protected override void Sort() { if (this.Items.Count > 1) { bool swapped; do { int counter = this.Items.Count - 1; swapped = false; while (counter > 0) { if (this.Items[counter].ToString().CompareTo( this.Items[counter - 1].ToString()) == -1) { object temp = Items[counter]; this.Items[counter] = this.Items[counter - 1]; this.Items[counter - 1] = temp; swapped = true; } counter -= 1; } } while (swapped); } } } 

您需要做的排序就是按字母顺序排序。 根据上面的示例,您可以使用CompareTo方法确定哪个字符串位于另一个字符串之前或之后。

现在您已拥有自己的自定义ListBox,您可以向其添加其他属性和字段:

 public class CustomListBox : ListBox { public bool SortByJG; // Other code... } 

然后,您可以更改排序方法以根据当前排序模式更改搜索,如下所示:

 while (counter > 0) { bool swap; if (this.SortByJG) { string[] breakDownCurrent = this.Items[counter].ToString().Split(' '); string[] breakDownPrevious = this.Items[counter - 1].ToString().Split(' '); if (breakDownCurrent[1].CompareTo(breakDownPrevious[1]) == -1) { swap = true; } } else { if (this.Items[counter].ToString().CompareTo( this.Items[counter - 1].ToString()) == -1) { swap = true; } } if (swap) { object temp = Items[counter]; this.Items[counter] = this.Items[counter - 1]; this.Items[counter - 1] = temp; swapped = true; } counter -= 1; } 

要进行排序工作,请设置Sorted = true;ListBox

更新:因为OP很难理解,所以这是整个class级:

 using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; // You need this namespace for ListBox namespace WindowsApplication1 { public class CustomListBox : ListBox { public CustomListBox() : base() { } public bool SortByJG; protected override void Sort() { if (this.Items.Count > 1) { bool swapped; do { int counter = this.Items.Count - 1; swapped = false; while (counter > 0) { bool swap = false; if (this.SortByJG) { string[] breakDownCurrent = this.Items[counter].ToString().Split(' '); string[] breakDownPrevious = this.Items[counter - 1].ToString().Split(' '); if (breakDownCurrent[1].CompareTo(breakDownPrevious[1]) == -1) { swap = true; } } else { if (this.Items[counter].ToString().CompareTo( this.Items[counter - 1].ToString()) == -1) { swap = true; } } if (swap) { object temp = Items[counter]; this.Items[counter] = this.Items[counter - 1]; this.Items[counter - 1] = temp; swapped = true; } counter -= 1; } } while (swapped); } } } } 

您现在还可以添加自己的方法来使用指定的模式进行排序:

 public void Sort(bool sortByJG) { this.SortByJG = sortByJG; if (this.Sorted) { this.Sort(); } else { this.Sorted = true; } } 

第一种算法与字母顺序相同,因此您可以直接使用:

 int res = string.Compare(first,second); 

第二种算法是降序最后两个字符的字母顺序:

 int res = -string.Compare(first.Substring(first.Length - 2, 2), second.Substring(first.Length - 2, 2)); 

要对列表进行排序,您有两种选择; 第一个是创建自己的ListBox子类,并覆盖ListBox.Sort方法的MSDN页面上详述的Sort 方法 。

第二个(更简单和更丑陋)是将所有项目放在一个集合中,订购集合并替换列表中的项目,如下所示:

 using System.Collections.Generic; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { void SortListBox() { List items = new List(); foreach (string value in listBox1.Items) { items.Add(value); } items.Sort((first, second) => string.Compare(first, second)); listBox1.Items.Clear(); listBox1.Items.AddRange(items.ToArray()); } } } 

希望这可以帮助…