Was sometimes getting an error message during the Paste operation of a table Row or Column. B2012-085 and B2012-086

Fixed some other Copy/Paste Rows/Columns table bugs as well.
This commit is contained in:
John Jenko 2012-04-03 14:23:34 +00:00
parent 3ac0159ce5
commit bfb9e3c19e

View File

@ -2311,8 +2311,12 @@ namespace Volian.Controls.Library
//foreach (CellRange crng in this.MergedRanges) //foreach (CellRange crng in this.MergedRanges)
// Console.WriteLine("merge ranges [{0},{1}] - [{2},{3}]", crng.r1, crng.c1, crng.r2, crng.c2); // Console.WriteLine("merge ranges [{0},{1}] - [{2},{3}]", crng.r1, crng.c1, crng.r2, crng.c2);
} }
private void AdjustMergedRows(int row, bool above, bool removing)
{
AdjustMergedRows(row, 1, above, removing);
}
private void AdjustMergedRows(int row, bool above, bool removing) private void AdjustMergedRows(int row, int cnt, bool above, bool removing)
{ {
CellRangeCollection crc = new CellRangeCollection(this); CellRangeCollection crc = new CellRangeCollection(this);
if (removing) if (removing)
@ -2324,7 +2328,7 @@ namespace Volian.Controls.Library
{ {
if (r.TopRow != r.BottomRow) if (r.TopRow != r.BottomRow)
{ {
cr.r2--; cr.r2 -= cnt;
crc.Add(cr); crc.Add(cr);
} }
} }
@ -2333,8 +2337,8 @@ namespace Volian.Controls.Library
if (row <= r.r1) if (row <= r.r1)
{ {
if (row < r.r1) if (row < r.r1)
cr.r1--; cr.r1 -= cnt;
cr.r2--; cr.r2 -= cnt;
} }
crc.Add(cr); crc.Add(cr);
} }
@ -2347,34 +2351,40 @@ namespace Volian.Controls.Library
int inspos = (above) ? row : row - 1; int inspos = (above) ? row : row - 1;
if (r.ContainsRow(inspos)) if (r.ContainsRow(inspos))
{ {
if ((above && cr.r1 == inspos) || (!above && cr.r2 == inspos)) bool adjustMergeValues = true;
if (cr.r1 == row && cr.r2 == row + cnt -1)
adjustMergeValues = false; // don't add to existing merge range - we will add a new merge range for this copy
for (int insCnt = 0; insCnt < cnt; insCnt++)
{ {
string tstr = ""; if ((above && cr.r1 == inspos) || (!above && cr.r2 == inspos))
int newrow = 0;
if (above)
{ {
if (this[cr.r1 + 1, cr.c1] != null) string tstr = "";
tstr = this[cr.r1 + 1, cr.c1].ToString(); int newrow = 0;
newrow = cr.r1; if (above)
{
if (this[cr.r1 + cnt, cr.c1] != null)
tstr = this[cr.r1 + cnt, cr.c1].ToString();
newrow = cr.r1;
}
else
{
if (this[cr.r2, cr.c1] != null)
tstr = this[cr.r2, cr.c1].ToString();
newrow = cr.r2 + cnt;
}
if (tstr != null && tstr.Length > 0)
for (int x = cr.c1; x <= cr.c2; x++)
this[newrow, x] = tstr;
} }
else if (adjustMergeValues) cr.r2++;
{
if (this[cr.r2, cr.c1] != null)
tstr = this[cr.r2, cr.c1].ToString();
newrow = cr.r2 + 1;
}
if (tstr != null && tstr.Length > 0)
for (int x = cr.c1; x <= cr.c2; x++)
this[newrow, x] = tstr;
} }
cr.r2++;
} }
else else
{ {
if (inspos < cr.r1) if (inspos < cr.r1)
{ {
cr.r1++; cr.r1 += cnt;
cr.r2++; cr.r2 += cnt;
} }
} }
crc.Add(cr); crc.Add(cr);
@ -2387,7 +2397,12 @@ namespace Volian.Controls.Library
} }
} }
private void AdjustMergedColumns(int col, bool left, bool removing) private void AdjustMergedColumns(int col, bool left, bool removing)
{
AdjustMergedColumns(col, 1, left, removing); //adjusting for just one column
}
private void AdjustMergedColumns(int col, int cnt, bool left, bool removing)
{ {
CellRangeCollection crc = new CellRangeCollection(this); CellRangeCollection crc = new CellRangeCollection(this);
if (removing) if (removing)
@ -2399,7 +2414,7 @@ namespace Volian.Controls.Library
{ {
if (r.LeftCol != r.RightCol) if (r.LeftCol != r.RightCol)
{ {
cr.c2--; cr.c2 -= cnt;
crc.Add(cr); crc.Add(cr);
} }
} }
@ -2407,9 +2422,8 @@ namespace Volian.Controls.Library
{ {
if (col < cr.c1) if (col < cr.c1)
{ {
cr.c1--; cr.c1-=cnt;
cr.c2--; cr.c2-=cnt; }
}
crc.Add(cr); crc.Add(cr);
} }
} }
@ -2421,31 +2435,34 @@ namespace Volian.Controls.Library
int inspos = (left) ? col : col - 1; int inspos = (left) ? col : col - 1;
if (r.ContainsCol(inspos)) if (r.ContainsCol(inspos))
{ {
string tstr = ""; for (int insCnt = 0; insCnt < cnt; insCnt++)
int newcol = 0;
if (left)
{ {
if (inspos == cr.c1) string tstr = "";
tstr = (this[cr.r1, cr.c1 + 1] == null)?"":this[cr.r1, cr.c1 + 1].ToString(); int newcol = 0;
if (left)
{
if (inspos == cr.c1)
tstr = (this[cr.r1, cr.c1 + 1] == null) ? "" : this[cr.r1, cr.c1 + 1].ToString();
else
tstr = (this[cr.r1, cr.c1] == null) ? "" : this[cr.r1, cr.c1].ToString();
newcol = cr.c1;
}
else else
tstr = (this[cr.r1, cr.c1] == null) ? "" : this[cr.r1, cr.c1].ToString(); {
newcol = cr.c1; if (this[cr.r1, cr.c2] != null)
} tstr = this[cr.r1, cr.c2].ToString();
else newcol = cr.c2 + 1;
{ }
if (this[cr.r1, cr.c2] != null) for (int x = cr.r1; x <= cr.r2; x++)
tstr = this[cr.r1, cr.c2].ToString(); this[x, newcol] = tstr;
newcol = cr.c2 + 1;
}
for (int x = cr.r1; x <= cr.r2; x++)
this[x, newcol] = tstr;
cr.c2++; cr.c2++;
}
} }
else if (col <= r.c1) else if (col <= r.c1)
{ {
cr.c1++; cr.c1+=cnt;
cr.c2++; cr.c2+=cnt;
} }
crc.Add(cr); crc.Add(cr);
} }
@ -2814,45 +2831,46 @@ namespace Volian.Controls.Library
if (MyCopyInfo.MyCopiedFlexGrid == null || MyCopyInfo.MyCopyOption != GridCopyOption.Row) return; if (MyCopyInfo.MyCopiedFlexGrid == null || MyCopyInfo.MyCopyOption != GridCopyOption.Row) return;
int rowsToAdd = MyCopyInfo.MyCopiedCellRange.r2 - MyCopyInfo.MyCopiedCellRange.r1 + 1; int rowsToAdd = MyCopyInfo.MyCopiedCellRange.r2 - MyCopyInfo.MyCopiedCellRange.r1 + 1;
int colsToAdd = Math.Max((MyCopyInfo.MyCopiedCellRange.c2 - MyCopyInfo.MyCopiedCellRange.c1 + 1) - Cols.Count, 0); int colsToAdd = Math.Max((MyCopyInfo.MyCopiedCellRange.c2 - MyCopyInfo.MyCopiedCellRange.c1 + 1) - Cols.Count, 0);
int rowOffset = Selection.r1 + (pp == enmPastePos.After ? 1 : 0) - MyCopyInfo.MyCopiedCellRange.r1;
int selR1 = Selection.r1; int selR1 = Selection.r1;
int selR2 = Selection.r2;
int rowOffset = selR1 + (pp == enmPastePos.After ?(selR2-selR1)+1 : 0) - MyCopyInfo.MyCopiedCellRange.r1;
// If the rows we are copying has more columns than the current table, then append then needed columns to the grid // If the rows we are copying has more columns than the current table, then append then needed columns to the grid
if (colsToAdd > 0) if (colsToAdd > 0)
{ {
Cols.Add(colsToAdd); Cols.Add(colsToAdd);
AdjustMergedColumns(Cols.Count - 1, false, false); AdjustMergedColumns(Cols.Count - 1, colsToAdd, false, false);
MyBorders.InsertColumns(Cols.Count - colsToAdd - 1, colsToAdd); MyBorders.InsertColumns(Cols.Count - colsToAdd - 1, colsToAdd);
} }
switch (pp) switch (pp)
{ {
case enmPastePos.Before: case enmPastePos.Before:
//this.Rows.InsertRange(Selection.r1,rowsToAdd);
this.Rows.InsertRange(selR1, rowsToAdd); this.Rows.InsertRange(selR1, rowsToAdd);
AdjustMergedRows(selR1, true, false); AdjustMergedRows(selR1, rowsToAdd, true, false);
MyBorders.InsertRows(Rows.Count - rowsToAdd - 1, rowsToAdd);
break; break;
case enmPastePos.After: case enmPastePos.After:
if (selR1 < Rows.Count - 1) if (selR2+1 < Rows.Count - 1)
{ {
//this.Rows.InsertRange(Selection.r1 + 1, rowsToAdd); this.Rows.InsertRange(selR2 + 1, rowsToAdd);
this.Rows.InsertRange(selR1 + 1, rowsToAdd); AdjustMergedRows(selR1+1, rowsToAdd, false, false);
} }
else else
this.Rows.Add(rowsToAdd); this.Rows.Add(rowsToAdd);
AdjustMergedRows(selR1 + 1, false, false); MyBorders.InsertRows(Rows.Count - rowsToAdd - 1, rowsToAdd);
break; break;
case enmPastePos.Replace: case enmPastePos.Replace:
if (rowsToAdd > Rows.Count - Selection.r1) if (rowsToAdd > Rows.Count - Selection.r1)
{ {
this.Rows.Add(rowsToAdd - (Rows.Count - Selection.r1)); int numToAdd = rowsToAdd - (Rows.Count = selR1);
AdjustMergedRows(selR1, false, false); this.Rows.Add(numToAdd);
AdjustMergedRows(selR1, numToAdd, false, false);
} }
break; break;
} }
RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1 + rowOffset, MyCopyInfo.MyCopiedCellRange.c1, MyCopyInfo.MyCopiedCellRange.r2 + rowOffset, MyCopyInfo.MyCopiedCellRange.c2); RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1 + rowOffset, MyCopyInfo.MyCopiedCellRange.c1, MyCopyInfo.MyCopiedCellRange.r2 + rowOffset, MyCopyInfo.MyCopiedCellRange.c2);
for (int r = MyCopyInfo.MyCopiedCellRange.r1; r <= MyCopyInfo.MyCopiedCellRange.r2; r++) for (int r = MyCopyInfo.MyCopiedCellRange.r1; r <= MyCopyInfo.MyCopiedCellRange.r2; r++)
{ {
Rows[r + rowOffset].Height = MyCopyInfo.MyCopiedFlexGrid.Rows[r].Height; Rows[r + rowOffset].Height = MyCopyInfo.MyCopiedFlexGrid.Rows[r].Height;
@ -2863,15 +2881,26 @@ namespace Volian.Controls.Library
{ {
Cols[c].Width = Math.Max(Cols[c].Width, MyCopyInfo.MyCopiedFlexGrid.Cols[c].Width); Cols[c].Width = Math.Max(Cols[c].Width, MyCopyInfo.MyCopiedFlexGrid.Cols[c].Width);
CellRange cr = GetCellRange(crm.r1 + rowOffset, crm.c1, crm.r2 + rowOffset, crm.c2); CellRange cr = GetCellRange(crm.r1 + rowOffset, crm.c1, crm.r2 + rowOffset, crm.c2);
// if the paste is above - copy merge range for the destination
// if the paste is below - put back the range for the source location
if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1)) if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1))
MergedRanges.Add(cr); MergedRanges.Add(cr);
this[r + rowOffset, c] = MyCopyInfo.MyCopiedFlexGrid[r, c]; this[r + rowOffset, c] = MyCopyInfo.MyCopiedFlexGrid[r, c];
MatchStyle(crm, cr); MatchStyle(crm, cr);
PasteBorders(r + rowOffset, c, r, c); PasteBorders(r + rowOffset, c, r, c);
// if the paste is above - put back the range for the source location
// if the paste is below - copy merge range for the destination
int r1 = crm.r1 + rowsToAdd - rowOffset;
int r2 = crm.r2 + rowsToAdd - rowOffset;
CellRange ncr = GetCellRange(r1, crm.c1, r2, crm.c2);
if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1))
MergedRanges.Add(ncr);
} }
} }
} }
this.AdjustGridControlSize(); this.AdjustGridControlSize();
CopyToCopiedFlexGrid(MyCopyInfo.MyCopyOption);
} }
private void MatchStyle(CellRange crm, CellRange cr) private void MatchStyle(CellRange crm, CellRange cr)
@ -2904,8 +2933,9 @@ namespace Volian.Controls.Library
int colsToAdd = MyCopyInfo.MyCopiedCellRange.c2 - MyCopyInfo.MyCopiedCellRange.c1 + 1; int colsToAdd = MyCopyInfo.MyCopiedCellRange.c2 - MyCopyInfo.MyCopiedCellRange.c1 + 1;
int rowsToAdd = Math.Max((MyCopyInfo.MyCopiedCellRange.r2 - MyCopyInfo.MyCopiedCellRange.r1 + 1) - Rows.Count, 0); int rowsToAdd = Math.Max((MyCopyInfo.MyCopiedCellRange.r2 - MyCopyInfo.MyCopiedCellRange.r1 + 1) - Rows.Count, 0);
int colOffset = Selection.c1 + (pp == enmPastePos.After ? 1 : 0) - MyCopyInfo.MyCopiedCellRange.c1;
int selC1 = Selection.c1; int selC1 = Selection.c1;
int selC2 = Selection.c2;
int colOffset = selC1 + (pp == enmPastePos.After ? (selC2-selC1)+1 : 0) - MyCopyInfo.MyCopiedCellRange.c1;
// If the columns we are copying has more rows than the current table, then append the needed rows to the grid // If the columns we are copying has more rows than the current table, then append the needed rows to the grid
if (rowsToAdd > 0) if (rowsToAdd > 0)
@ -2918,32 +2948,33 @@ namespace Volian.Controls.Library
switch (pp) switch (pp)
{ {
case enmPastePos.Before: case enmPastePos.Before:
//this.Cols.InsertRange(Selection.c1, colsToAdd);
this.Cols.InsertRange(selC1, colsToAdd); this.Cols.InsertRange(selC1, colsToAdd);
AdjustMergedColumns(selC1, true, false); AdjustMergedColumns(selC1, colsToAdd, true, false);
MyBorders.InsertColumns(Cols.Count - colsToAdd - 1, colsToAdd);
break; break;
case enmPastePos.After: case enmPastePos.After:
//if (Selection.c1 < Cols.Count - 1) if (selC2+1 < Cols.Count - 1)
// this.Cols.InsertRange(Selection.c1 + 1, colsToAdd); {
if (selC1 < Cols.Count - 1) this.Cols.InsertRange(selC2+1, colsToAdd);
this.Cols.InsertRange(selC1 + 1, colsToAdd); AdjustMergedColumns(selC1+1, colsToAdd, false, false);
}
else else
this.Cols.Add(colsToAdd); this.Cols.Add(colsToAdd);
AdjustMergedColumns(selC1 + 1, false, false); MyBorders.InsertColumns(Cols.Count - colsToAdd - 1, colsToAdd);
break; break;
case enmPastePos.Replace: case enmPastePos.Replace:
//if (colsToAdd > Cols.Count - Selection.c1)
// this.Cols.Add(colsToAdd - (Cols.Count - Selection.c1));
if (colsToAdd > Cols.Count - selC1) if (colsToAdd > Cols.Count - selC1)
{ {
this.Cols.Add(colsToAdd - (Cols.Count - selC1)); int numToAdd = colsToAdd - (Cols.Count - selC1);
AdjustMergedColumns(selC1, true, false); this.Cols.Add(numToAdd);
AdjustMergedColumns(selC1, numToAdd, true, false);
} }
break; break;
} }
RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1, MyCopyInfo.MyCopiedCellRange.c1 + colOffset, MyCopyInfo.MyCopiedCellRange.r2, MyCopyInfo.MyCopiedCellRange.c2 + colOffset); RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1, MyCopyInfo.MyCopiedCellRange.c1 + colOffset, MyCopyInfo.MyCopiedCellRange.r2, MyCopyInfo.MyCopiedCellRange.c2 + colOffset);
// Fix the merge ranges
for (int c = MyCopyInfo.MyCopiedCellRange.c1; c <= MyCopyInfo.MyCopiedCellRange.c2; c++) for (int c = MyCopyInfo.MyCopiedCellRange.c1; c <= MyCopyInfo.MyCopiedCellRange.c2; c++)
{ {
Cols[c + colOffset].Width = MyCopyInfo.MyCopiedFlexGrid.Cols[c].Width; Cols[c + colOffset].Width = MyCopyInfo.MyCopiedFlexGrid.Cols[c].Width;
@ -2954,15 +2985,28 @@ namespace Volian.Controls.Library
{ {
Rows[r].Height = Math.Max(Rows[r].Height, MyCopyInfo.MyCopiedFlexGrid.Rows[r].Height); Rows[r].Height = Math.Max(Rows[r].Height, MyCopyInfo.MyCopiedFlexGrid.Rows[r].Height);
CellRange cr = GetCellRange(crm.r1, crm.c1 + colOffset, crm.r2, crm.c2 + colOffset); CellRange cr = GetCellRange(crm.r1, crm.c1 + colOffset, crm.r2, crm.c2 + colOffset);
// if the paste is to the left - copy merge range for the destination
// if the paste is to the right - put back the range for the source location
if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1)) if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1))
MergedRanges.Add(cr); MergedRanges.Add(cr);
// copy cell text to the destination, copy the style, copy the cell borders
this[r, c + colOffset] = MyCopyInfo.MyCopiedFlexGrid[r, c]; this[r, c + colOffset] = MyCopyInfo.MyCopiedFlexGrid[r, c];
MatchStyle(crm, cr); MatchStyle(crm, cr);
PasteBorders(r, c + colOffset, r, c); PasteBorders(r, c + colOffset, r, c);
// if the paste is to the left - put back the range for the source location
// if the paste is to the right - copy merge range for the destination
int c1 = crm.c1 + colsToAdd - colOffset;
int c2 = crm.c2 + colsToAdd - colOffset;
CellRange ncr = GetCellRange(crm.r1, c1, crm.r2, c2);
if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1))
MergedRanges.Add(ncr);
} }
} }
} }
this.AdjustGridControlSize(); this.AdjustGridControlSize();
CopyToCopiedFlexGrid(MyCopyInfo.MyCopyOption);
} }
public void PasteCopiedCells() public void PasteCopiedCells()
@ -2986,21 +3030,25 @@ namespace Volian.Controls.Library
if (rowsToAdd > 0) if (rowsToAdd > 0)
{ {
if (selR2 < Rows.Count - 1) if (selR2 < Rows.Count - 1)
{
this.Rows.InsertRange(selR2 + 1, rowsToAdd); this.Rows.InsertRange(selR2 + 1, rowsToAdd);
AdjustMergedRows(selR2 + 1, false, false);
}
else else
this.Rows.Add(rowsToAdd); this.Rows.Add(rowsToAdd);
MyBorders.InsertRows(selR2,rowsToAdd); MyBorders.InsertRows(selR2,rowsToAdd);
AdjustMergedRows(selR2 + 1, false, false);
} }
if (colsToAdd > 0) if (colsToAdd > 0)
{ {
if (selC2 < Cols.Count - 1) if (selC2 < Cols.Count - 1)
{
this.Cols.InsertRange(selC2 + 1, colsToAdd); this.Cols.InsertRange(selC2 + 1, colsToAdd);
AdjustMergedColumns(selC2 + 1, false, false);
}
else else
this.Cols.Add(colsToAdd); this.Cols.Add(colsToAdd);
MyBorders.InsertColumns(selC2,colsToAdd); MyBorders.InsertColumns(selC2,colsToAdd);
AdjustMergedColumns(selC2 + 1, false, false);
} }
RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1 + rowOffset, MyCopyInfo.MyCopiedCellRange.c1 + colOffset, MyCopyInfo.MyCopiedCellRange.r2 + rowOffset, MyCopyInfo.MyCopiedCellRange.c2 + colOffset); RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1 + rowOffset, MyCopyInfo.MyCopiedCellRange.c1 + colOffset, MyCopyInfo.MyCopiedCellRange.r2 + rowOffset, MyCopyInfo.MyCopiedCellRange.c2 + colOffset);
@ -3026,6 +3074,7 @@ namespace Volian.Controls.Library
} }
} }
this.AdjustGridControlSize(); this.AdjustGridControlSize();
CopyToCopiedFlexGrid(MyCopyInfo.MyCopyOption);
} }
#endregion // Copy/Paste #endregion // Copy/Paste