c# - 在 DataGridView 中将自动生成的列设置为只读

标签 c# winforms datagridview .net-4.6

我有一个 DataGridView,它的 DataSource 是一个有五列的 DataTable。如果我尝试访问列的 ReadOnly 属性,如下所示:

datagridview.Columns[1].ReadOnly = true; 

它抛出一个 NullReferenceExcpetion

我知道这是由于框架如何管理其自动生成的列,正如对 this question 的回答所指出的那样.

我的问题是:当数据源自动生成时,如何将列设置为只读?

最佳答案

不能真正说出为什么它不起作用,但可以使用以下代码进行简单测试:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.AutoGenerateColumns = true;
        dataGridView1.DataSource = GenerateData();

        dataGridView1.Columns[0].ReadOnly = true;
    }

    private List<DataSourceTest> GenerateData()
    {
        return new List<DataSourceTest>()
        {
            new DataSourceTest(1, "A"),
            new DataSourceTest(2, "B"),
            new DataSourceTest(3, "C"),
            new DataSourceTest(4, "D"),
            new DataSourceTest(5, "E"),
            new DataSourceTest(6, "F"),
        };
    }
}

public class DataSourceTest
{
    public DataSourceTest(int id, string name) { ID = id; Name = name; }
    public int ID { get; set; }
    public string Name { get; set; }
}

并将 gridview EditMode 设置为 EditOnEnter 以便我们可以轻松地检查它是否是只读的,这表明它做得很好。

但如果您仍有问题,最好的办法是使用一个事件,最接近您问题的事件是 DataBindingComplete,它会在绑定(bind)完成后触发完成,所以到那时,您将拥有对所有列的完全访问权限,因为它们已经绑定(bind)到 gridview 对象。

双击 GridView 控件中的事件并添加只读 setter :

private void dataGridView1_DataBindingComplete(
    object sender, DataGridViewBindingCompleteEventArgs e)
{
    dataGridView1.Columns[0].ReadOnly = true;
}

关于c# - 在 DataGridView 中将自动生成的列设置为只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35890478/

相关文章:

javascript - 如何向在后面的 C# 代码中创建的 div 添加 onclick 事件?

c# - 如何查找和删除未使用的类以清理我的代码?

C# 验证特定输入

c# - DataGridView 不显示我的列

c# - DataGridView 双下划线单元格

c# - 如何从类中向 Datagridview 添加行?

c# - 设置Listbox的滚动条位置

c# - 自定义 TabControl 显示问题

c# - 当 RenderMode 为 "System"时,ToolStripMenuItem 无法显示复选标记和图像(图标)?

c# - 如何创建一个新类来检查图像类型?