1

我有一个包含 3 列的 Gridview,最初在表单加载期间,我只有两列可见,一列将包含数据,另一列将包含复选框。

我希望当我选中特定单元格中的复选框时,对应于该复选框,第三列单元格将可见,我不想完成第三列以在选中复选框时可见,Gridview 是硬编码的,只有行是动态的(column1 ,column2 设置为可见,column 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

好吧,您可以为此尝试 RowCommand 事件,但正如我所见,您已经为复选框创建了事件,尝试查找特定行的行索引,然后使用单元格编号(单元格 [2])查找控件并将其属性分配为可见 =错误的,

于 2013-08-16T09:54:36.253 回答
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

是的,实际上我们不能让隐形,但我想以简单的方式解释它。使用

datagridview.rows(e.rowindex).cells[your column name]=true ; 

使用它不允许用户在文本框中输入数据。如果它是假的,那么我们可以修改它/输入任何文本。

datagridview.rows(e.rowindex).cells[your column name].backcolour=color.gray/white/black;

使用它,我们可以为特定的文本框填充颜色,当复选框为真/假时,该文本框将被绘制;

于 2017-05-20T11:32:16.503 回答