我试图弄清楚如何将dataGridView中的单元格设置为ReadOnly 该复选框由boolean属性添加。因此,我寻找提示如何基于具有布尔属性的列完成将单元格设置为只读的任务。
以下是我的代码片段。
[DisplayName("Lock")]
public bool RevenueLock { get; set; }
revenue = new DomesticCostRevenue()
{
RevenueLock = Convert.ToBoolean(values[10]),
Revenue = Convert.ToDouble(values[11])
};
domestic.Add(revenue);
}
CostRevenueGridView.DataSource = domestic;
这是我所做的,但到目前为止没有成功。
foreach (DataGridViewRow row in CostRevenueGridView.Rows)
{
if ((bool)row.Cells["RevenueLock"].Value == true)
{
row.Cells["Revenue"].ReadOnly = true;
//MessageBox.Show("Lock");
}
}
答案 0 :(得分:1)
您可以将整列或整行或特定单元格设置为只读:
this.dataGridView1.Columns[1].ReadOnly = true;
this.dataGridView1.Rows[0].ReadOnly = true;
this.dataGridView1.Rows[0].Cells[1].ReadOnly = true;
<强>测试强>
将以下代码放在按钮单击或其他位置以显示表单。在第一行中,第二个单元格将是只读的,因为第一个单元格值为true:
var f = new Form();
f.Controls.Add(new DataGridView
{
Name = "g",
Dock = DockStyle.Fill
});
f.Load += (se, ev) =>
{
var g = ((Form)se).Controls["g"] as DataGridView;
g.AutoGenerateColumns = true;
g.AllowUserToAddRows = false;
g.DataSource = new List<C1>
{
new C1{P1=true, P2="x"},
new C1{P1=false, P2="y"},
};
foreach (DataGridViewRow row in g.Rows)
{
if ((bool)row.Cells["P1"].Value == true)
row.Cells["P2"].ReadOnly = true;
}
};
f.ShowDialog();
以下是C1类的代码:
public class C1
{
public bool P1 { get; set; }
public string P2 { get; set; }
}
此问题也不存在DataTable
:
f.Load += (se, ev) =>
{
var g = ((Form)se).Controls["g"] as DataGridView;
g.AutoGenerateColumns = true;
g.AllowUserToAddRows = false;
var dt = new DataTable();
dt.Columns.Add("P1", typeof(bool));
dt.Columns.Add("P2", typeof(string));
dt.Rows.Add(true, "x");
dt.Rows.Add(false, "y");
g.DataSource = dt;
foreach (DataGridViewRow row in g.Rows)
{
if ((bool)row.Cells["P1"].Value == true)
row.Cells["P2"].ReadOnly = true;
}
};
答案 1 :(得分:0)
我通过创建DataTable
重新创建了您的问题,填充了与您匹配的两列,然后使用您发布的foreach
循环。我的结果和你的一样。 ReadOnly
的单个单元格仍然可以编辑。
我不确定为什么会这样,但是因为Reza让它与List<T>
合作,我认为它与DataTable
有关。
尝试订阅RowsAdded
活动,并将支票移至那里。列名可能不适用于此代码...如果不是,请改用列索引。
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
for (int index = e.RowIndex; index <= e.RowIndex + e.RowCount - 1; index++)
{
var currentRow = dataGridView1.Rows[index];
if (Convert.ToBoolean(currentRow.Cells[0].Value))
currentRow.Cells[1].ReadOnly = true;
}
}
答案 2 :(得分:0)
感谢您的帮助。我终于能够解决我的问题了。下面的代码片段是我的解决方案。
private void CostRevenueGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
foreach (DataGridViewRow row in CostRevenueGridView.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
if (cell.ColumnIndex == 12)
{
if (Convert.ToBoolean(CostRevenueGridView.Rows[row.Index].Cells[cell.ColumnIndex].Value))
{
row.Cells[11].ReadOnly = true;
}
}
}
}
}