如何从 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 来显示您的数据,并且数据以数组或对象列表的形式表示。这也可以使用 DataSetDataTable 来完成,但为简单起见,我使用了一个对象数组。

回答您直接问题的代码在 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; }
}