2014-03-04 53 views
0

enter image description here移動選擇從列表框中的項目到另一個使用字典

我有兩個listboxes.the留下一個從該代碼的約束和值都到了詞典:

public void Roster_Shown(object sender, EventArgs e) 
    {    
     SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=Basketball;Integrated Security=True;User ID=apo;Password=nia2"); 
     con.Open(); 
     SqlDataAdapter sda = new SqlDataAdapter("SELECT PLAYERS.ID, PLAYERS.NO, PLAYERS.SURNAME, PLAYERS.FIRSTNAME, CAST(PLAYERS.NO AS VARCHAR) + ' - ' + PLAYERS.SURNAME + ', ' + PLAYERS.FIRSTNAME AS PLAYER FROM PLAYERS INNER JOIN TEAMS ON PLAYERS.TEAM_ID = TEAMS.ID WHERE (TEAMS.NAME ='" + ht + "')ORDER BY PLAYERS.NO", con); 
      DataTable dt = new DataTable(); 
      sda.Fill(dt); 

      listBox1.DataSource = dt; 
      listBox1.DisplayMember = "PLAYER"; 
      listBox1.ValueMember = "ID"; 

      dictionary = new Dictionary<string,string>(); 
      for (int i = 0; i < dt.Rows.Count; i++) 
       dictionary.Add(dt.Rows[i]["ID"].ToString(), dt.Rows[i]["PLAYER"].ToString()); 
con.Close(); 
    } 

我想移動選擇的項目使用此字典的第二個(右列表框2)。「ID」是tha值,「PLAYER」是顯示的文本。我想使用兩個按鈕。一個將項目發送到右側的列表框2,一個將選定的項目移回到第一個列表框1。

任何建議?A嘗試下面的代碼,但不工作.ADD()是用於移動項目的類,REMOVE()用於移回項目。

private void button1_Click(object sender, EventArgs e) 
    { 
     ADD(); 
    } 
    private void ADD() 
    { 
     listBox2.DataSource = new BindingSource(Roster_Shown.dictionary, null); 
     listBox2.DisplayMember = "ID"; 
     listBox2.ValueMember = "PLAYER"; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     REMOVE(); 
    } 
    private void REMOVE() 
    { 
     int c = listBox2.Items.Count - 1; 

     for (int i = c; i >= 0; i--) 
     { 
      if (listBox2.GetSelected(i)) 
      { 
       listBox1.Items.Add(listBox2.Items[i]); 
       listBox2.Items.RemoveAt(i); 
      } 
     } 
    } 

Image shows the result using the code from Dmitry 圖片顯示了使用從梅德代碼的結果,但我需要只顯示文本,並保存在某個地方的ID(也許在一個ArrayList或字典),因爲我需要獲得所有的ID並將它們轉移到另一個winform中的新列表框中

將以下代碼添加到Dmitry的代碼中,該應用程序正在運行完美。

 public void button7_Click(object sender, EventArgs e) 
    { 
    if (listBox2.Items.Count > 4) 
     { 
      if (listBox4.Items.Count > 4) 
      { 

       Game game = new Game(); 

       foreach (ListItem item in listBox2.Items) 
       { 
        dictionaryHome.Add(item.Id, item.Name); 
        game.listBoxHome.DisplayMember = dictionaryHome.Values.ToString(); 
        game.listBoxHome.ValueMember = dictionaryHome.Keys.ToString(); 
        game.listBoxHome.DataSource = (from Values in dictionaryHome.Values select Values).ToList(); 

        //int itemId = item.Id; 
       } 
    this.Hide(); 

       game.Show(); 

      } 
     } 
     } 

用一種新的形式button7一個新的列表框需要的所有項目從listbox2(正確的),並有兩個ID(鍵)和value.Many感謝梅德!

回答

1

MSDN

DataSource屬性設置,用戶不能修改該項目集合。

試試這個示例代碼:

internal sealed class TwoListsForm : Form 
{ 
    private sealed class ListItem : IComparable<ListItem> 
    { 
     public int Id; 
     public string Name; 

     public int CompareTo(ListItem other) 
     { 
      return other == null ? 1 : Id.CompareTo(other.Id); 
     } 

     public override string ToString() 
     { 
      return Name; 
     } 
    } 

    private System.Windows.Forms.ListBox lstLeft; 
    private System.Windows.Forms.ListBox lstRight; 
    private System.Windows.Forms.Button btnToRight; 
    private System.Windows.Forms.Button btnToLeft; 

    public TwoListsForm() 
    { 
     InitializeComponent(); 
    } 

    public TwoListsForm(string ht) 
    { 
     InitializeComponent(); 

     using (SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=Basketball;Integrated Security=True;User ID=apo;Password=nia2")) 
     { 
      con.Open(); 
      using (SqlDataAdapter sda = new SqlDataAdapter("SELECT PLAYERS.ID, PLAYERS.NO, PLAYERS.SURNAME, PLAYERS.FIRSTNAME, CAST(PLAYERS.NO AS VARCHAR) + ' - ' + PLAYERS.SURNAME + ', ' + PLAYERS.FIRSTNAME AS PLAYER FROM PLAYERS INNER JOIN TEAMS ON PLAYERS.TEAM_ID = TEAMS.ID WHERE (TEAMS.NAME ='" + ht + "')ORDER BY PLAYERS.NO", con)) 
      using (DataTable dt = new DataTable()) 
      { 
       sda.Fill(dt); 

       object[] items = new object[dt.Rows.Count]; 
       for (int i = 0; i < dt.Rows.Count; i++) 
        items[i] = new ListItem { Id = (int)dt.Rows[i]["ID"], Name = dt.Rows[i]["PLAYER"].ToString() }; 
       lstLeft.Items.AddRange(items); 
      } 
      con.Close(); 
     } 
    } 

    private void InitializeComponent() 
    { 
     this.lstLeft = new System.Windows.Forms.ListBox(); 
     this.lstRight = new System.Windows.Forms.ListBox(); 
     this.btnToRight = new System.Windows.Forms.Button(); 
     this.btnToLeft = new System.Windows.Forms.Button(); 
     this.SuspendLayout(); 
     // 
     // lstLeft 
     // 
     this.lstLeft.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
        | System.Windows.Forms.AnchorStyles.Left))); 
     this.lstLeft.FormattingEnabled = true; 
     this.lstLeft.Location = new System.Drawing.Point(12, 12); 
     this.lstLeft.Name = "lstLeft"; 
     this.lstLeft.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; 
     this.lstLeft.Size = new System.Drawing.Size(242, 264); 
     this.lstLeft.Sorted = true; 
     this.lstLeft.TabIndex = 0; 
     // 
     // lstRight 
     // 
     this.lstRight.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
        | System.Windows.Forms.AnchorStyles.Right))); 
     this.lstRight.FormattingEnabled = true; 
     this.lstRight.Location = new System.Drawing.Point(341, 12); 
     this.lstRight.Name = "lstRight"; 
     this.lstRight.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; 
     this.lstRight.Size = new System.Drawing.Size(242, 264); 
     this.lstRight.Sorted = true; 
     this.lstRight.TabIndex = 1; 
     // 
     // btnToRight 
     // 
     this.btnToRight.Anchor = System.Windows.Forms.AnchorStyles.None; 
     this.btnToRight.Location = new System.Drawing.Point(260, 77); 
     this.btnToRight.Name = "btnToRight"; 
     this.btnToRight.Size = new System.Drawing.Size(75, 23); 
     this.btnToRight.TabIndex = 2; 
     this.btnToRight.Text = ">>>"; 
     this.btnToRight.UseVisualStyleBackColor = true; 
     this.btnToRight.Click += new System.EventHandler(this.btnToRight_Click); 
     // 
     // btnToLeft 
     // 
     this.btnToLeft.Anchor = System.Windows.Forms.AnchorStyles.None; 
     this.btnToLeft.Location = new System.Drawing.Point(260, 180); 
     this.btnToLeft.Name = "btnToLeft"; 
     this.btnToLeft.Size = new System.Drawing.Size(75, 23); 
     this.btnToLeft.TabIndex = 3; 
     this.btnToLeft.Text = "<<<"; 
     this.btnToLeft.UseVisualStyleBackColor = true; 
     this.btnToLeft.Click += new System.EventHandler(this.btnToLeft_Click); 
     // 
     // TwoListsForm 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.ClientSize = new System.Drawing.Size(595, 290); 
     this.Controls.Add(this.btnToLeft); 
     this.Controls.Add(this.btnToRight); 
     this.Controls.Add(this.lstRight); 
     this.Controls.Add(this.lstLeft); 
     this.Name = "TwoListsForm"; 
     this.Text = "Two Lists Form"; 
     this.ResumeLayout(false); 
    } 

    private void btnToRight_Click(object sender, EventArgs e) 
    { 
     moveItems(lstLeft, lstRight); 
    } 

    private void btnToLeft_Click(object sender, EventArgs e) 
    { 
     moveItems(lstRight, lstLeft); 
    } 

    private void moveItems(ListBox from, ListBox to) 
    { 
     if (from.SelectedItems.Count == 0) 
     { 
      MessageBox.Show("Empty selection"); 
      return; 
     } 
     object[] tmp = new object[from.SelectedItems.Count]; 
     from.SelectedItems.CopyTo(tmp, 0); 
     to.Items.AddRange(tmp); 
     from.BeginUpdate(); 
     foreach (var item in tmp) 
      from.Items.Remove(item); 
     from.EndUpdate(); 
    } 
} 

用法:

using (TwoListsForm frm = new TwoListsForm(/* Your ht value */)) 
    frm.Show(); 

得到正確的列表框項目的id:

foreach (ListItem item in lstRight.Items) 
{ 
    int itemId = item.Id; 
    ... 
} 

編輯:項外觀糾正。
編輯2:獲取項目ID添加。

+0

是的這是工作。這將移動項目,因爲它顯示在新的形象。我只想顯示文本並將ID保存到其他地方。可能在一個數組列表或字典中,因爲我需要一個新按鈕來獲取所有ID並將它們傳送到另一個WINFORM中的新列表框。 – Apollon

+0

已更新示例。唯一的變化是在'ListItem.ToString'方法中。現在只會顯示文字。 – Dmitry

+0

Thanks.Now是否有可能獲得列表框2的所有ID並在另一個winform中填充新的列表框? – Apollon

相關問題