Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用字典将选定项从列表框移动到另一个列表框_C#_Winforms_Dictionary_Listbox - Fatal编程技术网

C# 使用字典将选定项从列表框移动到另一个列表框

C# 使用字典将选定项从列表框移动到另一个列表框,c#,winforms,dictionary,listbox,C#,Winforms,Dictionary,Listbox,我有两个列表框。左一个是从该代码绑定而来的,值将被放入字典: 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");

我有两个列表框。左一个是从该代码绑定而来的,值将被放入字典:

    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();
     } 
图中显示了使用Dmitry中的代码得到的结果,但我只需要显示文本并将id保存在某个位置(可能在arraylist或dictionary中),因为我需要获取第二个列表的所有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();

            }
        }
       }
使用按钮7,一个新形式的新列表框将从列表框2(右一)中获取所有项目,并具有id(键)和值。非常感谢Dmitry

当设置了
DataSource
属性时,用户无法修改items集合

请尝试以下示例代码:

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();
    }
}
获取正确列表框项目的ID:

foreach (ListItem item in lstRight.Items)
{
    int itemId = item.Id;
    ...
}
编辑:项目外观已更正。

EDIT2:获取添加的项目ID。

是,这正在工作。这将移动新图像中显示的项目。我只想显示文本并将ID保存在其他地方。可能在arraylist或dictionary中,因为我需要一个新按钮来获取所有ID并将其传输到另一个winform中的新列表框。示例已更新。唯一的更改是
ListItem.ToString
方法。现在只显示文本。谢谢。现在可以获取列表框2的所有ID并在另一个winform中填充新的列表框吗?当然可以!只需将它们转换为
ListItem
类型。我已经更新了答案。为了能够在表单之间共享
ListItem
s,请将其公开。非常感谢Dmitry。正在按照您告诉我的方式工作。
using (TwoListsForm frm = new TwoListsForm(/* Your ht value */))
    frm.Show();
foreach (ListItem item in lstRight.Items)
{
    int itemId = item.Id;
    ...
}