如何从 ObjectListView 中选定项目的特定列获取数据?
How to get data from a specific column of selected item(s) in ObjectListView?
我有一个 ObjectListView,我需要获取已被单击的行的特定列的值。
例如:
Imgur (我会直接把图片放在这里,但我没有这样做的声誉。)
我需要从我单击的行中获取 ID(无论我在行中的哪个位置单击 - 我的意思是在该行中的哪一列)。
谢谢。
使用 SelectionChanged 事件并从那里访问模型对象的相应 属性。假设您的模型 class 被命名为 MyDataObject:
private void olv_SelectionChanged(object sender, EventArgs e) {
if (olv.SelectedObject is MyDataObject data) {
// Access data.Id or whatever else you need
}
}
为了清楚地回答我的问题,我提供了一个完整的工作示例供您使用。此示例创建示例数据、数据网格视图、windows 表单,然后显示 windows 表单。然后它响应鼠标单击,显示 MessageBox
以显示单击行的 ID。
我假设您正在使用 DataGridView
来显示您的数据,并且数据以数组或对象列表的形式表示。这也可以使用 DataSet
和 DataTable
来完成,但为简单起见,我使用了一个对象数组。
回答您直接问题的代码在 MouseClick
事件处理程序中,它设置了 selectedObject
变量:
void Main()
{
var data = new[] {
new MyData { Id = 1, Typ = "Prichozi", Castka = 500, Datum = new DateTime(2019, 4, 16), Ucel = "test" },
new MyData { Id = 2, Typ = "Odchozi", Castka = 250, Datum = new DateTime(2019, 4, 16), Ucel = "test" },
new MyData { Id = 3, Typ = "Prichozi", Castka = 2000, Datum = new DateTime(2019, 4, 16), Ucel = "test" },
new MyData { Id = 4, Typ = "Odchozi", Castka = 3500, Datum = new DateTime(2019, 4, 16), Ucel = "test" },
new MyData { Id = 5, Typ = "Prichozi", Castka = 5000, Datum = new DateTime(2019, 4, 16), Ucel = "test" }
};
var view = new DataGridView();
view.AllowUserToAddRows = false;
view.AllowUserToDeleteRows = false;
view.AllowUserToResizeRows = false;
view.Anchor = System.Windows.Forms.AnchorStyles.Top
| System.Windows.Forms.AnchorStyles.Bottom
| System.Windows.Forms.AnchorStyles.Left
| System.Windows.Forms.AnchorStyles.Right;
view.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
view.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
view.ReadOnly = true;
view.RowHeadersVisible = false;
view.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
view.Dock = System.Windows.Forms.DockStyle.Fill;
view.MouseClick += (sender, args) => {
// This is where the magic happens
var selectedObject = ((DataGridView)sender)
.SelectedRows.Cast<DataGridViewRow>()
.Select(dgvr => dgvr.DataBoundItem).Cast<MyData>()
.FirstOrDefault();
// Show your result
MessageBox.Show(
$"Selected row with ID: {selectedObject.Id}",
"Selection Notification",
MessageBoxButtons.OK,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly,
false);
};
view.DataSource = data;
var form = new Form { Width = 500, Height = 300 };
form.Controls.Add(view);
form.ShowDialog();
}
public class MyData
{
public int Id { get; set; }
public string Typ { get; set; }
public int Castka { get; set; }
public DateTime Datum { get; set; }
public string Ucel { get; set; }
}
我有一个 ObjectListView,我需要获取已被单击的行的特定列的值。
例如:
Imgur (我会直接把图片放在这里,但我没有这样做的声誉。)
我需要从我单击的行中获取 ID(无论我在行中的哪个位置单击 - 我的意思是在该行中的哪一列)。
谢谢。
使用 SelectionChanged 事件并从那里访问模型对象的相应 属性。假设您的模型 class 被命名为 MyDataObject:
private void olv_SelectionChanged(object sender, EventArgs e) {
if (olv.SelectedObject is MyDataObject data) {
// Access data.Id or whatever else you need
}
}
为了清楚地回答我的问题,我提供了一个完整的工作示例供您使用。此示例创建示例数据、数据网格视图、windows 表单,然后显示 windows 表单。然后它响应鼠标单击,显示 MessageBox
以显示单击行的 ID。
我假设您正在使用 DataGridView
来显示您的数据,并且数据以数组或对象列表的形式表示。这也可以使用 DataSet
和 DataTable
来完成,但为简单起见,我使用了一个对象数组。
回答您直接问题的代码在 MouseClick
事件处理程序中,它设置了 selectedObject
变量:
void Main()
{
var data = new[] {
new MyData { Id = 1, Typ = "Prichozi", Castka = 500, Datum = new DateTime(2019, 4, 16), Ucel = "test" },
new MyData { Id = 2, Typ = "Odchozi", Castka = 250, Datum = new DateTime(2019, 4, 16), Ucel = "test" },
new MyData { Id = 3, Typ = "Prichozi", Castka = 2000, Datum = new DateTime(2019, 4, 16), Ucel = "test" },
new MyData { Id = 4, Typ = "Odchozi", Castka = 3500, Datum = new DateTime(2019, 4, 16), Ucel = "test" },
new MyData { Id = 5, Typ = "Prichozi", Castka = 5000, Datum = new DateTime(2019, 4, 16), Ucel = "test" }
};
var view = new DataGridView();
view.AllowUserToAddRows = false;
view.AllowUserToDeleteRows = false;
view.AllowUserToResizeRows = false;
view.Anchor = System.Windows.Forms.AnchorStyles.Top
| System.Windows.Forms.AnchorStyles.Bottom
| System.Windows.Forms.AnchorStyles.Left
| System.Windows.Forms.AnchorStyles.Right;
view.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
view.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
view.ReadOnly = true;
view.RowHeadersVisible = false;
view.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
view.Dock = System.Windows.Forms.DockStyle.Fill;
view.MouseClick += (sender, args) => {
// This is where the magic happens
var selectedObject = ((DataGridView)sender)
.SelectedRows.Cast<DataGridViewRow>()
.Select(dgvr => dgvr.DataBoundItem).Cast<MyData>()
.FirstOrDefault();
// Show your result
MessageBox.Show(
$"Selected row with ID: {selectedObject.Id}",
"Selection Notification",
MessageBoxButtons.OK,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly,
false);
};
view.DataSource = data;
var form = new Form { Width = 500, Height = 300 };
form.Controls.Add(view);
form.ShowDialog();
}
public class MyData
{
public int Id { get; set; }
public string Typ { get; set; }
public int Castka { get; set; }
public DateTime Datum { get; set; }
public string Ucel { get; set; }
}