winforms 如何将DataGridView绑定到特定属性?

vptzau2j  于 2023-01-14  发布在  其他
关注(0)|答案(2)|浏览(150)

假设这是我的数据类

class Data
{
    public int A { set; get;}
    public long B { set; get;}
    public string C { set; get;}
}

现在我有一个Data的集合作为数据源,我希望DataGridView绑定到它。
但是我只想在视图中显示AC,最简单的方法是什么?

k4aesqcs

k4aesqcs1#

将所需列添加到设计器中的网格。将每列的DataPropertyName设置为要绑定到的数据源属性/列的名称。在代码中绑定数据之前,将AutoGenerateColumns设置为false,以便网格不会创建任何额外的列。

ct2axkht

ct2axkht2#

您的问题是如何将DataGridView绑定到特定属性。您提到您有一个Data的集合,但没有说明它是否可观察(例如BindingList<Data>)。你用***来结束你的帖子,最简单的方法是什么?***虽然这是一个观点问题,我个人认为非常简单的一种方法是 allowAutoGenerateColumns,并在表单的OnLoad覆盖中对可绑定源进行列格式化。

示例

public partial class MainForm : Form
{
    public MainForm() => InitializeComponent();
    internal BindingList<Data> Rows { get; } = new BindingList<Data>();
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        dataGridView.AllowUserToAddRows = false;
        dataGridView.DataSource = Rows;
        dataGridView.CellEndEdit += (sender, e) => dataGridView.Refresh();

        #region F O R M A T    C O L U M N S
        Rows.Add(new Data()); // <= Auto-generate columns
        dataGridView.Columns["A"].Width = 50;
        dataGridView.Columns["A"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        dataGridView.Columns["A"].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
        dataGridView.Columns["C"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        dataGridView.Columns["C"].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
        Rows.Clear();
        #endregion F O R M A T    C O L U M N S

        // Add a few items
        Rows.Add(new Data { A = 1, B = 1000L });
        Rows.Add(new Data { A = 2, B = 2000L });
        Rows.Add(new Data { A = 3, B = 3000L });
    }
}

Data类定义列是否显示以及是否使用可见性和属性进行编辑。

class Data
{
    // A visible, editable cell.
    public int A { get; set; }

    // Non-visible because property is declared as internal.
    internal long B { get; set; }

    // Visible, read-only cell that dynamically responds
    // when cell 'A" is edited due to Refresh() 
    public string C => $"A={A} B={B}";

    // Non-visible because of attribute.
    [Browsable(false)]
    public string? D { get; set; } = "Not visible";        
}

另一种方法是,如果列首先存在,则可以显示-隐藏它。例如:dataGridView.Columns["C"].Visible = false .

相关问题