11

DataGridView コントロールを持つ winForm があります。5 つの列が含まれており、そのうちの 1 つは CheckBox 列です。同じ行の別の列にある値に基づいて、この列のチェックボックス セルを有効/無効にしたい。

DisabledCheckBoxCellを使用して列全体を無効にできます

ただし、列全体が無効な状態になります。

これは DataGridView のスニペットです。

ソース列 | DestinationColumn
真 |
true |有効
false |有効 無効

これを.Netでどのように実現できるか、誰にもわかりません。

4

4 に答える 4

23

ビジェイ、

DataGridViewCheckBoxColumn には無効というプロパティがないため、チェックボックスのスタイルを変更することで、無効になっているように見せることができます。次のコードを見てください。

 private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
    {
        if (e.RowIndex == 1)
        {
            DataGridViewCell cell=dataGridView1.Rows[e.RowIndex].Cells[0];
            DataGridViewCheckBoxCell chkCell = cell as DataGridViewCheckBoxCell;
            chkCell.Value = false;
            chkCell.FlatStyle = FlatStyle.Flat;
            chkCell.Style.ForeColor = Color.DarkGray;
            cell.ReadOnly = true;

        }

    }
于 2012-04-27T19:47:28.793 に答える
2

実際に無効になっているチェックボックスを表示するために、次のようなことをしました。

using System.Windows.Forms.VisualStyles;

public partial class YourForm : Form
{

    private static readonly VisualStyleRenderer DisabledCheckBoxRenderer;

    static YourForm()
    {
        DisabledCheckBoxRenderer = new VisualStyleRenderer(VisualStyleElement.Button.CheckBox.UncheckedDisabled);
    }

    private void dataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
    {
        if (e.RowIndex > -1)
        {
            int checkBoxColumnIndex = this.yourCheckBoxColumn.Index;
            var checkCell = (DataGridViewCheckBoxCell)this.dataGridView[checkBoxColumnIndex, e.RowIndex];
            var bounds = this.dataGridView.GetCellDisplayRectangle(checkBoxColumnIndex , e.RowIndex, false);

            // i was drawing a disabled checkbox if i had set the cell to read only
            if (checkCell.ReadOnly)
            {
                const int CheckBoxWidth = 16;
                const int CheckBoxHeight = 16;

                // not taking into consideration any cell style paddings
                bounds.X += (bounds.Width - CheckBoxWidth) / 2;
                bounds.Y += (bounds.Height - CheckBoxHeight) / 2;
                bounds.Width = CheckBoxWidth;
                bounds.Height = CheckBoxHeight;

                if (VisualStyleRenderer.IsSupported)
                {

                    // the typical way the checkbox will be drawn
                    DisabledCheckBoxRenderer.DrawBackground(e.Graphics, bounds);
                }
                else
                {

                    // this method is only drawn if the visual styles of the application
                    // are turned off (this is for full support)
                    ControlPaint.DrawCheckBox(e.Graphics, bounds, ButtonState.Inactive);
                }
            }
        }
    }
}
于 2015-04-15T19:43:41.480 に答える
0

GridView に RowDataBound イベントを使用してみてください。eventargs を行にキャストし、この行でコントロールを見つけて無効にすることができます。このイベントは、ヘッダーとフッターであっても、グリッドビューの各行に対して発生するため、例外をキャッチしないようにしてください。ここにあなたに役立つかもしれないいくつかのコードがあります

protected void xxx_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if ((e.Row != null) && e.Row.RowType == DataControlRowType.DataRow)
于 2012-04-26T11:50:02.580 に答える