我有一个 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/