C# 如何将对象的引用附加到ListView项?
我目前正在构建一个Windows窗体应用程序,以列出SQL数据库中的所有客户端。查询完所有客户机后,我将它们显示在列表视图中,允许用户单击其中一个客户机以获取更多信息。如何将对“客户端”对象的引用附加到listview中的项,以便在单击时恢复此特定对象 我曾尝试使用listView的索引,唯一的问题是我有一个过滤函数(搜索),在使用时会扰乱客户端的顺序C# 如何将对象的引用附加到ListView项?,c#,winforms,listview,C#,Winforms,Listview,我目前正在构建一个Windows窗体应用程序,以列出SQL数据库中的所有客户端。查询完所有客户机后,我将它们显示在列表视图中,允许用户单击其中一个客户机以获取更多信息。如何将对“客户端”对象的引用附加到listview中的项,以便在单击时恢复此特定对象 我曾尝试使用listView的索引,唯一的问题是我有一个过滤函数(搜索),在使用时会扰乱客户端的顺序 public class Client { public string _name; public in
public class Client
{
public string _name;
public int _id;
public Client(string name, int id)
{
_name = name;
_id = id;
}
}
public Form1()
{
public Client[10] clients;
for (int i = 0; i < 10; i++)
{
Client[i] = new Client(i.ToString(), i);
}
InitializeComponent();
foreach (Client client in clients)
{
ListViewItem item = new ListViewItem(client._name);
item.Tag = client;
ClientListView.Items.Add(item);
}
}
private void ClientListView_SelectedIndexChanged(object s, EventArgs e)
{
if (clientListView.SelectedItems.Count == 1)
{
var item = clientListView.SelectedItems[0];
Client client = (Client)item.Tag;
}
}
公共类客户端
{
公共字符串\u名称;
公共国际标识;
公共客户端(字符串名称,int-id)
{
_名称=名称;
_id=id;
}
}
公共表格1()
{
公众客户[10]名;
对于(int i=0;i<10;i++)
{
Client[i]=新客户端(i.ToString(),i);
}
初始化组件();
foreach(客户端中的客户端)
{
ListViewItem项目=新的ListViewItem(客户端名称);
item.Tag=客户端;
ClientListView.Items.Add(项目);
}
}
私有void客户端列表视图\u SelectedIndexChanged(对象、事件参数)
{
if(clientListView.SelectedItems.Count==1)
{
var item=clientListView.SelectedItems[0];
客户端=(客户端)item.Tag;
}
}
此解决方案仅在选择项时创建新的客户端对象,是否无法指向客户端数组中包含的原始对象?可能通过引用传递,但它似乎不起作用,可能标记不是一个好的解决方案…每个winforms控件(System.Windows.Forms.control)都有一个标记变量,它是一个对象(System.object)。这意味着您可以对标记进行任何引用。
例如:
Client client = new Client();
btn = new Button();
btn.Tag = client;
然后,在另一种方法中,您可以使用标记
Client oldClient = btn.Tag as Client;
当然,您可以使用(Client)btn.Tag
,但对我来说btn.Tag作为客户端
更易于使用,也更容易在其他人的代码上看到
注意:在代码开始时,它不会创建一个具有相同数据的新客户机。它保存的是引用(对象在应用程序内存中的位置),而不是数据。
ListViewItem
有一个标记
属性,它是对象。代码和文本不匹配。要么您不理解代码的功能,要么您复制了错误的代码?您认为Client-Client=(Client)item.Tag
正在做,为什么它不是您想要的(“指向客户端数组中包含的原始对象”)?如果您正在处理数据库中的数据,那么一个DatagrtView
和几行实现数据绑定的代码将比ListView要简单得多,而且所有内容都不会转换为文本。谢谢@nvoigt,我认为使用Client=(Client)item.Tag;将创建一个新对象,但似乎不是。