Datagridview强制只在列中选中一个复选框

时间:2012-07-13 08:05:11

标签: c# .net winforms datagridview checkbox

如何强制在Datagridview的列中仅选中一个复选框?

10 个答案:

答案 0 :(得分:4)

 private void grdRegClass_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (grdRegClass.Columns.IndexOf(grdRegClass.Columns["Status"]) == e.ColumnIndex)
        {
            int currentcolumnclicked = e.ColumnIndex;
            int currentrowclicked = e.RowIndex;
            foreach (DataGridViewRow dr in grdRegClass.Rows)
            {
                dr.Cells[currentcolumnclicked].Value = false;
            }
            grdRegClass.CurrentRow.Cells[currentrowclicked].Value = true;  
        }
    }

答案 1 :(得分:3)

您必须订阅网格的CellValueChanged事件,并根据当前单元格的检查状态,循环DataGridView并将true / false设置为其他单元格的值。

void grd_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
      if ((sender as DataGridView).CurrentCell is DataGridViewCheckBoxCell)
      {
           if (Convert.ToBoolean(((sender as DataGridView).CurrentCell as DataGridViewCheckBoxCell).Value))
           {
                   // Maybe have a method which does the
                    //loop and set value except for the current cell
            }
        }
}

答案 2 :(得分:2)

    private void dataGridViewProduit_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if ((sender as DataGridView).CurrentCell is DataGridViewCheckBoxCell)
        {
            if (Convert.ToBoolean(((sender as DataGridView).CurrentCell as DataGridViewCheckBoxCell).Value))
            {
                foreach (DataGridViewRow row in (sender as DataGridView).Rows)
                {
                    if (row.Index != (sender as DataGridView).CurrentCell.RowIndex && Convert.ToBoolean(row.Cells[e.ColumnIndex].Value) == true)
                    {
                        row.Cells[e.ColumnIndex].Value = false;
                    }
                }
            }
        }
    }

    private void dataGridViewClient_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (this.dataGridViewClient.IsCurrentCellDirty)
        {
            dataGridViewClient.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
    }

答案 3 :(得分:0)

您可以使用CellEndEdit DGV事件,因为它发生在修改单元格之后。请阅读以下代码段中的注释,以使用以下代码:

private void dgrvUserProfileView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    int CheckedCount = 0;

    //Make sure you have set True Value/ false Value property of check box column to 1/0 or true/false resp.
    //Lets say your column 5th(namely Department) is a checked box column
    if (dgrvUserProfileView.Columns[e.ColumnIndex].Name == "Department")
    {
        for (int i = 0; i <= dgrvUserProfileView.Rows.Count - 1; i++)
        {
            if (Convert.ToBoolean(dgrvUserProfileView.Rows[i].Cells["Department"].Value) == true)
            {
                CheckedCount = CheckedCount + 1;
            }
        }

        if (CheckedCount == 1)
        {
            for (int i = 0; i <= dgrvUserProfileView.Rows.Count - 1; i++)
            {
                if (Convert.ToBoolean(dgrvUserProfileView.Rows[i].Cells["Department"].Value) == true)
                {
                    dgrvUserProfileView.Rows[i].Cells["Department"].ReadOnly = true;
                }
            }
        }
        else
        {
            for (int i = 0; i <= dgrvUserProfileView.Rows.Count - 1; i++)
            {
                dgrvUserProfileView.Rows[i].Cells["Department"].ReadOnly = false;
            }
        }
    }
}

希望这有帮助!

答案 4 :(得分:0)

private void dgvlist_CellContentClick(object sender, DataGridViewCellEventArgs e)  
    {  
        int currentcolumnclicked = e.ColumnIndex;  
        for (int i = 0; i <= dgvlist.Columns.Count - 1; i++)  
        {  
            if (dgvlist.Columns[i] is DataGridViewCheckBoxColumn)  
            {  
                if (Convert.ToString(dgvlist.CurrentRow.Cells[i].EditedFormattedValue) == "True" && i !=currentcolumnclicked)  
                {  
                    dgvlist.CurrentRow.Cells[i].Value = false;  
                }  
            }  
        }  
    }  

答案 5 :(得分:0)

private void dgvCaixa_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if ((sender as DataGridView).CurrentCell is DataGridViewCheckBoxCell)
            {
                foreach (DataGridViewRow row in dgvCaixa.Rows)
                {
                    if (row.Index != dgvCaixa.CurrentCell.RowIndex && Convert.ToBoolean(row.Cells[e.ColumnIndex].Value) == true)
                    {
                        row.Cells[e.ColumnIndex].Value = false;
                    }
                }
            }
        }

答案 6 :(得分:0)

在vb.net中:

Private Sub DataGridViewJobsList_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridViewJobsList.CellValueChanged
    If TypeOf TryCast(sender, DataGridView).CurrentCell Is DataGridViewCheckBoxCell Then
        Dim cell1 As DataGridViewCell
        cell1 = TryCast(sender, DataGridView).CurrentCell
        If cell1.Value = True Then
            For Each row As DataGridViewRow In TryCast(sender, DataGridView).Rows
                If row.Index <> cell1.RowIndex AndAlso row.Cells(e.ColumnIndex).Value = "1" Then
                    row.Cells(e.ColumnIndex).Value = False
                End If
            Next
        End If
    End If
End Sub

Private Sub DataGridViewJobsList_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DataGridViewJobsList.CurrentCellDirtyStateChanged
    If Me.DataGridViewJobsList.IsCurrentCellDirty Then
        DataGridViewJobsList.CommitEdit(DataGridViewDataErrorContexts.Commit)
    End If
End Sub

答案 7 :(得分:0)

您可以在 DGV 上将 VirtualMode 设置为 TRUE ,只允许一个复选框。并且您可以在 DatagridView 上将 VirtualMode 设置为 FALSE 以检查多个。

我认为这是解决方案最简单的方法。

答案 8 :(得分:0)

不用担心列和永远不会失败,试试这个:

private void DgvIVA_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    DataGridView dg = (DataGridView)sender;
    if (dg.Rows.Count == 0) return;
    if (dg.Rows[e.RowIndex].Cells[e.ColumnIndex].GetType() == typeof(DataGridViewCheckBoxCell))
    {
        int rowSelIndex = e.RowIndex;
        foreach (DataGridViewRow row in dg.Rows)
        {
            if (row.Index != rowSelIndex)
            {
                row.Cells[e.ColumnIndex].Value = false;
            }
        }
    }
}

答案 9 :(得分:-2)

private void dataGridView3_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 1)
            {
                try
                {
                    string val = dataGridView3.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                    if (val == "False")
                        val = "True";
                    else if (val == "True")
                        val = "False";
                    dataGridView3.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = val;

                for (int i = 0; i < dataGridView3.Rows.Count; i++)
                {
                    string active = "";
                    if (i != e.RowIndex)
                    {
                        if (val == "False")
                        {
                            dataGridView3.Rows[i].Cells[1].Value = "True";
                            active = "Y";
                        }
                        else if (val == "True")
                        {
                            dataGridView3.Rows[i].Cells[1].Value = "False";
                            active = "N";
                        }
                    }
                    else
                    {
                        if (val == "False")
                            active = "N";
                        else
                            active = "Y";
                    }




                }


            }
            catch (Exception ex)
            { }
        }
    }
相关问题