我正在尝试在DataGridView
中实现类似excel的功能。因此:
因此,对于第三个要求,我将SelectionMode
设为CellSelect
。对于列选择,我选择了列中的所有单元格,但是当我尝试打印SelectedColumns
时,它打印为零。看来我也必须选择列标题。我不知道如何以编程方式选择列标题。所需的代码如下。有人可以告诉我如何实现吗?
private void dataGridViewFileData_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
dataGridViewFileData.MultiSelect = true;
dataGridViewFileData.SelectionMode = DataGridViewSelectionMode.CellSelect;
for (int i = 0; i < dataGridViewFileData.Rows.Count; ++i)
dataGridViewFileData.Rows[i].Cells[0].Selected = true;
MessageBox.Show("Selected columns:" + dataGridViewFileData.SelectedColumns.Count.ToString());
}
答案 0 :(得分:3)
作为一个选项,您可以将SelectionMode
设置为CellSelect
,然后处理CellClick
并针对单击的单元格的行索引和列索引进行选择,然后选择该单元格或完整单元格行或整列或使用代码的所有单元格。
由于选择模式为CellSelect
,因此所选列或所选行为空,并且由于任何原因要跟踪所选列或所选行,则需要手动进行跟踪。
对于选择的视觉反馈同样如此,您需要设置标题的颜色或自己绘制。例如:
private async void Form1_Load(object sender, EventArgs e)
{
dataGridView1.ColumnCount = 3;
dataGridView1.RowCount = 3;
dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
dataGridView1.CellClick += DataGridView1_CellClick;
dataGridView1.EnableHeadersVisualStyles = false;
}
DataGridViewColumn selectedColumn = null;
DataGridViewRow selectedRow = null;
List<DataGridViewCell> selectedCells = null;
private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
dataGridView1.ClearSelection();
if (selectedColumn != null)
selectedColumn.HeaderCell.Style.BackColor =
dataGridView1.ColumnHeadersDefaultCellStyle.BackColor;
if (selectedRow != null)
selectedRow.HeaderCell.Style.BackColor =
dataGridView1.RowHeadersDefaultCellStyle.BackColor;
selectedColumn = null;
selectedRow = null;
selectedCells = null;
if (e.ColumnIndex == -1 && e.RowIndex == -1)
{
dataGridView1.SelectAll();
selectedCells = new List<DataGridViewCell>();
foreach (DataGridViewRow row in dataGridView1.Rows)
selectedCells.AddRange(row.Cells.Cast<DataGridViewCell>());
}
else if (e.ColumnIndex == -1 && e.RowIndex > -1)
{
selectedRow = dataGridView1.Rows[e.RowIndex];
foreach (DataGridViewCell cell in dataGridView1.Rows[e.RowIndex].Cells)
cell.Selected = true;
}
else if (e.ColumnIndex > -1 && e.RowIndex == -1)
{
selectedColumn = dataGridView1.Columns[e.ColumnIndex];
foreach (DataGridViewRow row in dataGridView1.Rows)
row.Cells[e.ColumnIndex].Selected = true;
}
else
{
selectedCells = selectedCells = new List<DataGridViewCell>()
{ dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] };
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = true;
}
if (selectedColumn != null)
selectedColumn.HeaderCell.Style.BackColor = SystemColors.Highlight;
if (selectedRow != null)
selectedRow.HeaderCell.Style.BackColor = SystemColors.Highlight;
}
答案 1 :(得分:0)
也许您可以尝试遍历DataGridView并检查是否选择了列中的所有单元格。然后定义一个List
来存储这些过滤的列。
List<DataGridViewColumn> selectedcolumns = new List<DataGridViewColumn>();
private void button1_Click(object sender, EventArgs e)
{
bool flag = true;
selectedcolumns.Clear();
foreach (DataGridViewColumn column in dataGridView1.Columns)
{
for (int i = 0; i < dataGridView1.RowCount; i++)
{
if (dataGridView1.Rows[i].Cells[column.Index].Selected == false)
{
flag = false;
break;
}
}
if (flag)
selectedcolumns.Add(column);
flag = true;
}
foreach (DataGridViewColumn c in selectedcolumns)
Console.WriteLine(c.Index);
}
答案 2 :(得分:0)
作为另一个选项,您可以处理OnCellMouseDown
事件,并根据单击的单元格决定设置SelectionMode
。这样,您可以获得视觉反馈以及SelectedColumns
和SelectedRows
:
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.ColumnCount = 3;
dataGridView1.RowCount = 3;
foreach (DataGridViewColumn c in dataGridView1.Columns)
c.SortMode = DataGridViewColumnSortMode.NotSortable;
dataGridView1.CellMouseDown += DataGridView1_CellMouseDown;
}
private void DataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
dataGridView1.ClearSelection();
if (e.ColumnIndex == -1 && e.RowIndex == -1)
{
dataGridView1.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
dataGridView1.SelectAll();
}
else if (e.ColumnIndex == -1 && e.RowIndex > -1)
{
dataGridView1.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
dataGridView1.Rows[e.RowIndex].Selected = true;
}
else if (e.ColumnIndex > -1 && e.RowIndex == -1)
{
dataGridView1.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
dataGridView1.Columns[e.ColumnIndex].Selected = true;
}
else
{
dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = true;
}
}