我有这个班级
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
。
选择数据源生成的列表中的第一个项目的正确方法是什么?
答案 0 :(得分:2)
您正在ToString()
类型的实例上调用ProjectName.UserData
,它会为您提供类型名称。
您想要访问该实例的Name
属性。
如果rdpUserList
是List<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;