C# 在DataGridView中启用按ColumnHeader、RowHeader和单元格进行选择
我正在尝试在DataGridView中实现类似excel的功能。因此: 如果他们选择列标题,它将选择列 如果用户选择行标题,则将选择整行 除此之外,如果他们选择单元格,则只会选择单个单元格。 因此,对于第三个需求,我将SelectionMode设置为CellSelect。对于列选择,我选择了列中的所有单元格,但当我尝试打印SelectedColumns时,它打印为零。似乎我还必须选择列标题。我不知道如何以编程方式选择列标题。所需代码如下。有人能告诉我如何做到这一点吗C# 在DataGridView中启用按ColumnHeader、RowHeader和单元格进行选择,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我正在尝试在DataGridView中实现类似excel的功能。因此: 如果他们选择列标题,它将选择列 如果用户选择行标题,则将选择整行 除此之外,如果他们选择单元格,则只会选择单个单元格。 因此,对于第三个需求,我将SelectionMode设置为CellSelect。对于列选择,我选择了列中的所有单元格,但当我尝试打印SelectedColumns时,它打印为零。似乎我还必须选择列标题。我不知道如何以编程方式选择列标题。所需代码如下。有人能告诉我如何做到这一点吗 private void d
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());
}
作为一个选项,您可以将设置为,然后处理与所单击单元格的行索引和列索引相关的和,并使用代码选择该单元格、或整行、整列或所有单元格 由于选择模式为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;
}
作为一个选项,您可以将设置为,然后处理与所单击单元格的行索引和列索引相关的和,并使用代码选择该单元格、或整行、整列或所有单元格 由于选择模式为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;
}
作为另一个选项,您可以处理事件,并根据单击的单元格决定设置。通过这种方式,您可以获得视觉反馈以及SelectedColumns和SelectedRows:
作为另一个选项,您可以处理事件,并根据单击的单元格决定设置。通过这种方式,您可以获得视觉反馈以及SelectedColumns和SelectedRows:
您的代码也不会选择columnheader或rowheader。因为它们的索引是-1。你的代码没有处理这种情况。这是我必须处理的特定条件。显然,选定的列或选定的行是空的,因为选择模式是CellSelect。如果我选择列中的所有单元格,那么它将不是列选择。因此,选定列计数必须为1。您使用的是DataGridView,选定列与选定列的所有单元格不同。但是,您可以将单击的列索引/单击的行索引保留在变量中。问题是另一个函数根据selectedcolumns.count删除选定的多列。我必须直观地显示所选列。您的代码也不会选择columnheader或rowheader。因为它们的索引是-1。你的代码没有处理这种情况。这是我必须处理的特定条件。显然,选定的列或选定的行是空的,因为选择模式是CellSelect。如果我选择列中的所有单元格,那么它将不是列选择。因此,选定列计数必须为1。您使用的是DataGridView,选定列与选定列的所有单元格不同。但是,您可以将单击的列索引/单击的行索引保留在变量中。问题是另一个函数根据selectedcolumns.count删除选定的多列。我必须直观地显示所选列。我也喜欢这个选项,可能更喜欢它。试试看,或者看看屏幕截图,让我知道你的反馈。我也喜欢这个选项,也许更喜欢。试试看,或者看看屏幕截图,让我知道你的反馈。