4

我是在 Stack 上发帖的新手。我已经搜索了很长一段时间来解决与我类似的问题。我正在尝试根据对象的布尔值动态地将 WinForms DataGridView 中的复选框从非只读更改为只读。

它在调试模式下显示更改已经发生,但是一旦完全运行,应该只读的复选框单元格仍然允许检查和取消选中功能。我已将注释掉的部分留在其中,以表明我已尝试这样做。

m_SingletonForm.dataGridView1.DataSource = list;
m_SingletonForm.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
m_SingletonForm.dataGridView1.Columns["StoreGroup"].ReadOnly = true;
m_SingletonForm.dataGridView1.Columns["Message"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
m_SingletonForm.dataGridView1[0, 0].ReadOnly = true;


foreach (DataGridViewRow row in m_SingletonForm.dataGridView1.Rows)
{
    //var isChecked = Convert.ToBoolean(row.Cells["SendFile"].Value);

    //if (!isChecked)
    //{
        //m_SingletonForm.dataGridView1.Rows[0].Cells["SendFile"].Style.BackColor = Color.Red;
        //m_SingletonForm.dataGridView1.Rows[0].Cells["SendFile"].ReadOnly = true;

        //m_SingletonForm.dataGridView1.Rows[row.Index].Cells["SendFile"].Style.BackColor = Color.Red;
        //m_SingletonForm.dataGridView1.Rows[row.Index].Cells["SendFile"].ReadOnly = true;
        //m_SingletonForm.dataGridView1["SendFile", row.Index].ReadOnly = true;
        //m_SingletonForm.dataGridView1["SendFile", row.Index].Style.BackColor = Color.Red;          
    // }
}

m_SingletonForm.label1.Text = message;
m_SingletonForm.Text = title;
MessageBox.Show(m_SingletonForm.dataGridView1[0, 0].ReadOnly.ToString());
m_SingletonForm.ShowDialog();

任何帮助将不胜感激。

4

1 回答 1

3

从该行m_SingletonForm.ShowDialog();看来,您在DataGridView显示*之前就拥有此代码。对于要应用网格项目的此类更改来说,这还为时过早。如果您的代码位于表单的构造函数中,您也会看到同样的问题。

解决该问题的最简单方法是在DataBindingComplete事件处理程序中放置用于将单元格设置为只读的代码。像这样的东西:

// Attach the event
m_SingletonForm.dataGridView1.DataBindingComplete += new
    DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete);


// And the code for the handler
void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    foreach (DataGridViewRow row in m_SingletonForm.dataGridView1.Rows)
    {
        var isChecked = Convert.ToBoolean(row.Cells["SendFile"].Value);

        if (!isChecked)
        {
            m_SingletonForm.dataGridView1.Rows[0].Cells["SendFile"].Style.BackColor = Color.Red;
            m_SingletonForm.dataGridView1.Rows[0].Cells["SendFile"].ReadOnly = true;

            m_SingletonForm.dataGridView1.Rows[row.Index].Cells["SendFile"].Style.BackColor = Color.Red;
            m_SingletonForm.dataGridView1.Rows[row.Index].Cells["SendFile"].ReadOnly = true;
            m_SingletonForm.dataGridView1["SendFile", row.Index].ReadOnly = true;
            m_SingletonForm.dataGridView1["SendFile", row.Index].Style.BackColor = Color.Red;
        }
    }            
}

*我从来没有 100% 弄清楚为什么会这样——我相信这与其中有两组单元格的事实有关DataGridView——编辑/ui 单元格和它们所在的数据。

于 2012-11-22T13:33:48.013 回答