1

私は 3 つの列を含む Gridview を持っていました。最初はフォームの読み込み中に、2 つの列のみが表示され、1 つの列にはデータがあり、もう 1 つの列にはチェックボックスがあります。

特定のセルのチェックボックスをオンにすると、そのチェックボックスに対応して 3 番目の列のセルが表示されます。3 番目の列を完成させてチェック ボックスをオンにしたときに表示されるようにしたくありません。Gridview は行のみが動的 (column1) 、column2 は表示に設定され、列 3 は非表示に設定されます)

下の画像で、チェックボックスをオンにすると、3番目の列が表示されますが、これは望ましくありません ここに画像の説明を入力

ここに画像の説明を入力

誰でもこれで私を助けることができますか?

以下のコードを試しましたが、特定のセルではなく、3 番目の列が表示されています

public form1() 
{
    dataGridView1.CellValueChanged += new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
}

void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    dataGridView1.Columns[e.ColumnIndex + 1].Visible = true;
}
4

3 に答える 3

0

これが私が試したデモです。正常に動作するようです。全体のアイデアは、 DataGridView で特定のセルを非表示にすることはできません。ただし、コントロール/要素を非表示にしたいときに通常のGUIエンジンが使用するように、非表示にすることができます(私はそう思います)。の でセルをペイントするようにカスタマイズするだけBackgroundColorですDataGridView。もちろん、それを機能させるのはそれほど簡単ではありません。これがあなたのためのコードです:

//First, you have to be sure the whole third column is Visible.
//CellPainting event handler for your dataGridView1
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        if (e.ColumnIndex == 2)//This is the Column index you want to hide.
        {                
            object o = e.RowIndex == -1 ? null : dataGridView1[e.ColumnIndex - 1,e.RowIndex].Value;
            if (o!=null &&!(bool)o || e.RowIndex == -1 || e.RowIndex == dataGridView1.RowCount - 1)
            {
                e.Graphics.FillRectangle(new SolidBrush(dataGridView1.BackgroundColor), e.CellBounds);
                if(e.RowIndex > -1) dataGridView1[e.ColumnIndex, e.RowIndex].ReadOnly = true;
                e.Handled = true;
            }
            if (o != null && (bool)o)
            {
                dataGridView1[e.ColumnIndex, e.RowIndex].ReadOnly = false;                    
            }
        }
    }
//CellContentClick event handler for your dataGridView1
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
   UpdateThirdColumCell(e);
}
//CellContentDoubleClick event handler for your dataGridView1
private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
{
   UpdateThirdColumCell(e);
}
private void UpdateThirdColumCell(DataGridViewCellEventArgs e)
{
        if (e.ColumnIndex == 1)//The column index of the CheckBox column
        {
            DataGridViewCheckBoxCell cell = (DataGridViewCheckBoxCell)dataGridView1[e.ColumnIndex, e.RowIndex];
            cell.Value = cell.EditingCellFormattedValue;
            dataGridView1.Invalidate();
            if ((bool)cell.Value)
            {
                dataGridView1.CurrentCell = dataGridView1[e.ColumnIndex + 1, e.RowIndex];
            }
        }
}
//CellStateChanged event handler for your dataGridView1
private void dataGridView1_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
    if (e.Cell.ColumnIndex == 2 && e.Cell.Selected)
    {
        dataGridView1.BeginEdit(false);
    }
}

それだけです:)

ここに画像の説明を入力

于 2013-08-16T10:41:39.197 に答える
0

このために RowCommand イベントを試すことができますが、既にチェックボックス用にイベントが作成されていることがわかります。特定の行の行インデックスを見つけてから、セル番号 (セル [2]) を使用してコントロールを見つけ、そのプロパティを可視として割り当てます =間違い、

于 2013-08-16T09:54:36.253 に答える