列表到数组:Datagrid中所选单元格的行,列索引

时间:2015-03-12 15:18:52

标签: c# arrays winforms datagridview

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

问题是因为可以随机选择单元格,即我可以选择第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
}

enter image description here

1 个答案:

答案 0 :(得分:0)

我不是百分百肯定,但我认为你最好选择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;
}