C#以编程方式创建datagridview - DataGridViewCheckBoxColumn cellValueChanged检查状态始终返回FALSE

时间:2017-04-21 12:08:25

标签: c# winforms datagridview

在C#中,我无法使DataGridViewCheckBoxColumn事件起作用。即使我点击了复选框,它总是会得到一个FALSE值。其他datagridviews(text和combobox)列工作正常。这就是我在做的......

好的,所以我根据选项卡控件中有多少选项卡表在运行时动态创建datagridviews(DGV),这是由任意给定日期范围内的周数确定的,即每个标签页一个DGV (每周的标签页)

for (int i = 0; i < wcNumWeeks; i++)
{
    foreach (DataRow dr in wbDatesDT.Rows)
    {
        if (Convert.ToInt16(dr["tabNo"].ToString()) == i + 1)
        {
        wcDate = Convert.ToDateTime(dr["wcDate"].ToString());
        break;
        }
    }
    weeksTabControl.TabPages.Add(wcDate.ToShortDateString());
    weeksTabControl.TabPages[i].AutoScroll = true;
    weeksTabControl.TabPages[i].Width = 1500;
    weeksTabControl.TabPages[i].Height = 700;
    weeksTabControl.TabPages[i].Controls.Add(new DataGridView()
    {
        Name = "dataGridView" + (i + 1).ToString(),
        Dock = DockStyle.Fill,
        Width = 1450,
        Height = 650,
        Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right),
        ScrollBars = System.Windows.Forms.ScrollBars.Both,
        AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells 
    });
}

再次在构造函数中,对于每个创建的datagridview,我创建事件如下:

foreach (Control thisControl in weeksTabControl.Controls)
{
    if (thisControl.GetType() == typeof(TabPage))
    {
        foreach (Control dgv in thisControl.Controls)
        {
        if (dgv.GetType() == typeof(DataGridView))
        {
            BuildWhiteboardDGV((DataGridView)dgv);
            PopulateWhiteboardDGV((DataGridView)dgv);
            wbDataGridView = (DataGridView)dgv;
            wbDataGridView.CellMouseUp += new DataGridViewCellMouseEventHandler(wbDataGridView_CellMouseUp);
            wbDataGridView.CellEndEdit += new DataGridViewCellEventHandler(wbDataGridView_CellEndEdit);
            wbDataGridView.CurrentCellDirtyStateChanged += new EventHandler(wbDataGridView_CurrentCellDirtyStateChanged);
            wbDataGridView.CellValueChanged += new DataGridViewCellEventHandler(wbDataGridView_CellValueChanged);
        }
        }
    }
}

事件本身如下:

void wbDataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (wbDataGridView.IsCurrentCellDirty)
    {
    wbDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}
 
void wbDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    try
    {
    if (e.ColumnIndex >= 13 && e.ColumnIndex <= 15)
    {
        System.Drawing.Point cur = new System.Drawing.Point(e.ColumnIndex, e.RowIndex);
        DataGridViewCheckBoxCell curCell = (DataGridViewCheckBoxCell)wbDataGridView[cur.X, cur.Y];
        if (curCell.Value != null && (bool)(curCell.Value) == true)
        {
        MessageBox.Show("TRUE");
        }
        else if (curCell.Value != null && (bool)(curCell.Value) == false)
        {
        MessageBox.Show("FALSE");
        }
        else
        {
        MessageBox.Show("NULL");
        }                   
    }
    return;
    }
    catch (Exception ex )
    {
    MessageBox.Show("wbDataGridView_CellValueChanged() ERROR - " + ex.Message + " --> " + ex.InnerException.ToString());
    return;
    }

}

我哪里错了?

1 个答案:

答案 0 :(得分:0)

好的....我想我已经对它进行了分类。

在我的CellMouseUp()事件中,我没有提供LEFT按钮。

因此,现在添加它,CellValueChanged()事件正常工作并捕获正确的DataGridViewCheckCellColumn检查状态:选中时为TRUE,未选中时为FALSE。

public void wbDataGridView_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left && e.RowIndex != -1) // added this and it now works
            {
                this.rowIndex = e.RowIndex;
                this.colIndex = e.ColumnIndex;
                this.wbDataGridView = (DataGridView)sender;
                return;
            }

            if (e.Button == System.Windows.Forms.MouseButtons.Right && e.RowIndex != -1)
            {
                this.rowIndex = e.RowIndex;
                this.colIndex = e.ColumnIndex;
                this.wbDataGridView = (DataGridView)sender;
                return;
            }
        }

感谢你的评论。非常感激。

乔布斯一个好人!!!!