Если вы не знаете наверняка, что диапазон всегда равен 10x10, и в этом случае это просто вопрос изменения условий цикла, вам понадобится способ обнаружения последовательных значений.
Этот фрагмент кода должен помочь вам в этом
/// <summary>
/// gets the number of consecutive (without any empty cell) values vertically
/// </summary>
/// <param name="aRow"></param>
/// <param name="aColumn"></param>
/// <returns></returns>
public int GetNumberConsecValues(int aRow, int aColumn)
{
int wCount = 0;
while (this[aRow + wCount, aColumn] != null)
{
wCount++;
}
return wCount;
}
и используйте его для считывания значений в массив / матрицу по мере необходимости:
/// <summary>
/// Reads the vertical array from the specified cell
/// </summary>
/// <param name="aRow"></param>
/// <param name="aColumn"></param>
/// <returns></returns>
public int[] ReadArrayInt(int aRow, int aColumn)
{
int wNbValues = this.GetNumberConsecValues(aRow, aColumn);
if (wNbValues == 0)
return null;
int[] wArr = new int[wNbValues];
for (int iRow = 0; iRow < wNbValues; iRow++)
{
wArr[iRow] = Convert.ToInt32(this[aRow + iRow, aColumn]);
}
return wArr;
}
Если вы знаете диапазон, вы можете использовать этот другой фрагмент кода
public object[,] ReadRange(int aColFrom, int aColTo, int aRowFrom, int aRowTo)
{
this.BeginUpdate();
try
{
SpreadsheetGear.IRange oRange = m_ViewLock.Workbook.ActiveWorksheet.Cells[aRowFrom, aColFrom, aRowTo, aColTo];
object[,] oValues = new object[aRowTo - aRowFrom + 1, aColTo - aColFrom + 1];
int iRCol = 0;
for (int iCol = aColFrom; iCol <= aColTo; iCol++)
{
int iRRow = 0;
for (int iRow = aRowFrom; iRow <= aRowTo; iRow++)
{
oValues[iRRow, iRCol] = oRange.Cells[iRRow, iRCol].Value;
iRRow++;
}
iRCol++;
}
return oValues;
}
finally
{
this.EndUpdate();
}
}
Где BeginUpdate и EndUpdate определены как:
/// <summary>
/// Must be called before the grid is being modified
/// We also call it inside every method so that if the user forgets to call it is no big deal
/// For this reason the calls can be nested.
/// So if the user forgets to make the call it is safe
/// and if the user does not forget he/she gets the full speed benefits..
/// </summary>
public void BeginUpdate()
{
if (m_ViewLockCount == 0)
m_ViewLock = new CWorkbookViewLockHelper(this.Workbook);
m_ViewLockCount++;
}
/// <summary>
/// Must be called after the grid has being modified
/// </summary>
public void EndUpdate()
{
m_ViewLockCount--;
if (m_ViewLockCount <= 0)
{
m_ViewLock.Dispose();
m_ViewLock = null;
}
}
person
Michael Moreno
schedule
18.07.2013