c# - 如何将对象的引用附加到 ListView 项?
问题描述
我目前正在构建一个 Windows 窗体应用程序来列出 SQL 数据库中的所有客户端。查询完所有客户后,我将它们显示在 ListView 中,允许用户单击其中一个客户以获取更多信息。如何将我的“客户”对象的引用附加到列表视图中的项目,以便在单击时恢复此特定对象?
我尝试使用 listView 的索引,唯一的问题是我有一个过滤功能(搜索),使用时会混淆客户端的顺序。
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;
}
}
此解决方案仅在选择项目时创建一个新的 Client 对象,有没有办法指向包含在 clients 数组中的原始对象?也许通过引用传递,但它似乎不起作用,也许标签不是一个好的解决方案......
解决方案
每个 winforms 控件 (System.Windows.Forms.Control) 都有一个 Tag 变量,它是一个对象 (System.Object)。这意味着您可以对标签进行任何引用。例如:
Client client = new Client();
btn = new Button();
btn.Tag = client;
然后,在另一种方法中,您可以使用标签。
Client oldClient = btn.Tag as Client;
当然你可以使用(Client)btn.Tag
,但对我btn.Tag as Client
来说更容易使用,并且可以查看其他人的代码。
PS:它不会在代码开始时创建一个与客户端相同数据的新客户端。它保存的是引用(对象在应用程序内存中的位置),而不是数据。
推荐阅读
- python - 如何在 Python 中生成独立的解析器?
- css - 在伪类的 scss 类中使用的 & 有什么区别?
- python - ImportError:无法从“时间”(未知位置)导入名称“时钟”
- python - 模型中的 Django 循环导入
- python - [ODBC SQL Server 驱动程序][DBNETLIB]SSL 安全错误 (18)
- c# - 如何有效地增长矩阵?
- mysql - MYSQL如何根据日期和响应的多个条件求和
- html - 如何使用规范标签?[将我的网站升级为多语言]
- python - 如何使用按钮单击来确定是否已单击/选中检查按钮以运行可执行文件?(与 tkinter)
- react-native - 将 AWS Amplify 数据存储用于社交媒体应用程序是一种好习惯吗?