【问题标题】:c#: adding new item to comboBoxc#:向组合框添加新项目
【发布时间】:2013-08-13 12:08:13
【问题描述】:

我希望将带有 IP 地址的客户列表添加到 winforms 中的组合框,但该列表没有出现在组合框中。

这是我的服务器代码

// this my list of sockets for each client connected to server
list<Socket> astr = new list<socket>();
    public Form1()
    {
        InitializeComponent();
        addfg();
        comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
    }

public void addfg() 
{
  foreach (Socket s in astr) 
  {
    string str = string.Format("client : " + s.RemoteEndPoint);
    comboBox1.Items.Add(new object[] {str})
  }
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
   MessageBox.Show(comboBox1.Items[0]);
 }

但我收到错误“ArgumentException 未处理”或详细信息“设置 DataSource 属性时无法修改项目集合”。

【问题讨论】:

  • 'as' 是 C# 关键字,只是说
  • 我在 comboBox1.Items.Add() 行遇到异常。
  • 对不起,我更改了'as'关键字。
  • 您应该显示分配comboBox1.DataSource 的代码,以便这里的人可以帮助您,一旦将comboBox1.DataSource 分配给非空值,您可以使用comboBox1.Items 只读,可以'不要再修改那个集合了。

标签: c# winforms combobox


【解决方案1】:

试试这样:

foreach (Socket s in astr) 
{
  string str = string.Format("client : " + s.RemoteEndPoint);
  comboBox1.Items.Add(str);
}

在您的版本中,您似乎正在尝试添加一个数组,但 Items.Add() 方法仅添加一个项目。要添加多个项目,您可以使用 AddRange(),但您的代码看起来不像这样。

小心这段代码:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
   MessageBox.Show(comboBox1.Items[0]);
}

您应该检查是否选择了某些内容:

if (comboBox1.Items.SelectedIndex > -1) {
   MessageBox.Show(comboBox1.Items[0]);
}

【讨论】:

  • 就像一个注释,但你最后的“小心”并没有什么区别:消息框显示列表中的第一个项目,所以无论有没有选择都没有'没关系。可能值得检查列表中是否有要显示的内容,但我想如果没有的话很难更改选定的索引...... :-)
  • 我仍然在同一个 comboBox1.Items.Add() 行收到错误“argumentexception was unhandled”。
  • @user2673943 通过将字符串添加到组合框的 Items 集合中不会出现该错误,所以它是别的东西。
  • @user2673943 如果您在组合框上使用 DataSource,则将项目添加到 DataSource,而不是 Items 集合。
  • 感谢 LarsTech 我在表单设计器中设置 DataSource 属性时犯了错误
【解决方案2】:

代替

  MessageBox.Show(comboBox1.Items[0]);

你可能想使用

MessageBox.Show(this.comboBox1.SelectedItem);

在这种情况下,消息框将显示所选项目。

而不是

comboBox1.Items.Add(new object[] {str})

您可以选择这样做:

    comboBox1.Items.Add(str);

在这种情况下添加字符串对象或:

comboBox1.Items.Add(new {Name = str})

现在您正在创建一个新的对象类型数组,并且您正在向其中添加 str ,就像它应该是一个属性一样。此外,不需要使用 Object[]。我所做的是当添加一个对象时,我创建了一个匿名类型,该类型具有一个名为 Name 的属性,该属性将保存 Str 的值。

【讨论】:

    【解决方案3】:

    Items.Add() 方法将一个对象作为参数。您正在尝试添加对象数组。改成这样:

    comboBox1.Items.Add(str);
    

    编辑:您已经(可能在表单设计器中)设置了删除此绑定所需的 DataSource 属性。

    【讨论】:

    • 我仍然在同一个 comboBox1.Items.Add() 行收到错误“argumentexception was unhandled”。
    【解决方案4】:

    我认为这会导致您的问题:

    string str = string.Format("client : " + s.RemoteEndPoint);
    

    尝试使用:

    string str = string.Format("client : " + ((IPEndPoint)s.RemoteEndPoint).Address.ToString());
    

    查看此链接: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.remoteendpoint.aspx

    您还应该将项目作为字符串而不是对象数组添加到组合框中。在索引更改事件中,您应该将字符串传递给 MessageBox.Show 而不是对象。

    我很好奇,您是否设法构建了您的示例?

    【讨论】:

    • 我也尝试过这种方式,但我得到了与上面提到的相同的错误。
    【解决方案5】:
     combobox1.Items.Add("item1");
     combobox1.Items.Add("item2");
    

    试试这个就行了

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      相关资源
      最近更新 更多