C#选择数据源生成列表中的第一项

时间:2017-06-01 12:07:58

标签: c# listbox

我有这个班级

class UserData
{
    public UserData() { }

    public string Name { get; set; }
    public string Val { get; set; }
}

我有一个普通的ListBox。我从MySql中选择数据。

private void ListUsers(string server)
{

    List<UserData> ls = new List<UserData>();

    foreach(dynamic obj in _data)
    {
        if(obj.servername == server)
        {
            ls.Add(new UserData() { Name = obj.username, Val = obj.password });
        }
    }
    UserList.Sorted = true;
    UserList.DisplayMember = "Name";
    UserList.ValueMember = "Val";
    UserList.DataSource = ls;
}

调试包含的ls

[0] 
    Name => "Test",
    Val => "12345"
[1] 
    Name => "Test2",
    Val => "54321"   

现在有时在该列表中只有1个帖子。如果发生这种情况,我想选择该条目或至少选择Name并将其粘贴到文本框中。

但由于某种原因,我无法实现这一目标。谷歌没有带来任何结果。至少不能解决我的问题。

我试过

rdpUserList.Items[0].ToString();

但这会给我ProjectName.UserData而不是Test

选择数据源生成的列表中的第一个项目的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

您正在ToString()类型的实例上调用ProjectName.UserData,它会为您提供类型名称。

您想要访问该实例的Name属性。

如果rdpUserListList<UserData>,您需要这样:

rdpUserList.Items[0].Name

如果它是数据源,则需要强制转换项目以访问其属性:

((ProjectName.UserData)rdpUserList.Items[0]).Name

答案 1 :(得分:1)

这个问题有两种方法。第一个是逻辑问题;您需要调用Name属性而不是ToString()方法。请注意,使用这种方式,您需要强制转换为您的对象类型。

((UserData)rdpUserList.Items[0]).Name

第二个选项是覆盖ToString()方法,以便您可以按照您尝试的方式调用名称。

class UserData
{
    public UserData() { }

    public string Name { get; set; }
    public string Val { get; set; }
    public override string ToString()
    { return this.Name; }
} 

然后打电话给 rdpUserList.Items[0].ToString()

答案 2 :(得分:0)

很抱歉以前的帖子,在我回答之前我没有测试过,

如果你愿意,可以试试以下内容,我只是喜欢linq:)

var item = rdpUserList.Items.OfType<ListItem>().First();
Class1 t = new Class1(){Id=Convert.ToInt32(item.Value), description = item.Text};

仅为名称<或者

string name = rdpUserList.Items.OfType<ListItem>().First().Text;