【问题标题】:List to Array : Row, Column Indices of Selected Cells in Datagrid列表到数组:Datagrid 中选定单元格的行、列索引
【发布时间】:2015-03-12 15:18:52
【问题描述】:

我有选定单元格的列表,我希望将它们转换为数组以便我可以保存它。 我正在转换数组中的列表,以便我可以获得所有选定单元格的索引(逐列),以便稍后检索以填充相同的单元格。

问题是因为可以随机选择单元格,即我可以选择第 1 行第 1、2、3、7、8、9 列,而未选择第 4、5、6 列。一旦我遇到未选择的索引,我就会收到“索引超出范围”错误。 如果我在数据网格中间选择了一些东西,即没有在开始时选择第 1、2、3 列,而是选择第 5 行、第 5、6、7 列,则会出现同样的错误。

可能有人可以在这方面提供帮助,或者可能指向执行相同任务的其他有效方法。

List<DataGridViewCell> selectedCells = new List<DataGridViewCell>();

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    DataGridViewCell cell = dataGridView1[e.ColumnIndex, e.RowIndex];
    if (selectedCells.Contains(cell) ) selectedCells .Remove(cell);
    else selectedCells .Add(cell);
    cell.Style.BackColor = selectedCells .Contains(cell) ? Color.Pink : Color.White;
}

private void buttonSaveButton_Click(object sender, EventArgs e)
{
    string [,] selectedcellsArray = new string[dataGridView1.Rows.Count, dataGridView1.Columns.Count];
    int i = 0;
    int j = 0;
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        while (j < dataGridView1.Columns.Count)
        {
            selectedcellsArray[i, j] = selectedCells[j].ColumnIndex.ToString();
            j++;
        }

        j = 0;
        i++; //next row
    } 
    //some more code
}

【问题讨论】:

  • 你为什么用selectedCells这个空列表代替row
  • @juharr selectedCells 不是空列表,我已添加代码供您考虑
  • 这里的问题是j 是基于列数的,但是您使用它来索引selectedCells。我真的不清楚你想在selectedcellsArray 中输入什么。你打算如何使用selectedcellsArray?或者您能否给出selectedCells 的示例值以及selectedcellsArray 的最终值?
  • @juharr 我正在尝试获取数组中选定单元格的索引 (col,row),以便我可以保存它们,然后我可以检索索引并准确填充颜色/突出显示那些填充颜色的单元格/保存前已选择。
  • 在这种情况下,selectedcellsArray 不应该是bool[,] 来指示选择了哪些单元格?也许你可以展示你打算如何使用selectedcellsArray

标签: c# arrays winforms datagridview


【解决方案1】:

我不是 100% 确定,但我认为你最好改用 bool[,]

private void buttonSaveButton_Click(object sender, EventArgs e)
{
    bool [,] cellIsSelected = new bool[dataGridView1.Rows.Count, dataGridView1.Columns.Count];
    foreach(var selectedCell in selectedCells)
    {
        cellIsSelected[selectedCell.RowIndex,selectedCell.ColumnIndex] = true;
    }

    for(int i=0; i<dataGridView1.Rows.Count; i++)
    {
        for(int j=0; j<dataGridView1.Columns.Count; j++)
        {
            //determine if the cell at postion i,j is selected
            if(cellIsSelected[i,j])
            {
                //It is selected.
            }
        }
    }
}

但如果这有效,您最好只跟踪它而不是选定单元格的列表(除非您在其他地方使用它们)。这也将假定dataGridView 具有一定数量的行和列。

bool[,] cellIsSelected = new bool[dataGridView1.Rows.Count, dataGridView1.Columns.Count];

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    cellIsSelected[e.RowIndex, e.ColumnIndex] = !cellIsSelected[e.RowIndex, e.ColumnIndex];
    cell.Style.BackColor = cellIsSelected[e.RowIndex, e.ColumnIndex] ? Color.Pink : Color.White;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 2016-03-26
    • 1970-01-01
    • 2023-04-03
    • 2018-03-11
    • 2018-09-17
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多