我有一个申请,我正在写的地方,我必须把街道地址的标签页,是预先定义的。此标签工作表有3列10行。我有正确创建标签的循环,但需要允许用户选择工作表上要开始的标签。我本以为这将是一个简单的数学矩阵方程,但我无法想出或找到一个解决办法。
下面是一个示例:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15 考虑到上面的矩阵,假设用户决定从#6开始,我需要告诉我的循环从那个位置开始: col:1行:2。
如果有帮助的话,我的循环看起来是这样的,但我认为这可以归结为一个我没有想过的数学方程:
for (var yCounter = 0; yCounter < _labelSettings.LabelPerColumn; yCounter++)
{
for (var xCounter = 0; xCounter < _labelSettings.ColumnsPerPage; xCounter++)
{
foreach (var table in customNugget.PdfTables)
{
table.YPosition = SheetSettings.PageHeight -
(verticalOffset + yCounter * ((verticalSize + verticalOffset)));
table.XPosition = horizontalOffset + xCounter * ((horizontalSize + horizontalOffset));
}
}
}编辑
private static int _cellsPerRow = 3;
private static int _startIndex;
static void Main(string[] args)
{
string userInput = Console.ReadLine();
_startIndex = int.Parse(userInput);
int startY = _startIndex / _cellsPerRow;
int startX = (_startIndex - 1) % _cellsPerRow;
Console.WriteLine(string.Format("The index you chose lives in the following matrix location:\n Row: {0} Column: {1}", startY, startX));
Console.WriteLine("Press any key to continue...");
Console.Read();
}发布于 2013-11-01 16:12:30
假设您知道每一行中的单元格数(我认为应该是_labelSettings.ColumnsPerPage),则可以计算开始值,如下所示:
int cells = 5;//number of cells per row
int startAt = 6;//cell number to start at
int startY = (startAt - 1) / cells;//1
int startX = (startAt - 1) % cells;//0然后,您可以使用这些开始值来初始化您的循环,但是您需要小心,以确保您的内部循环在第一次运行时只使用计算的开始值。要做到这一点,您可以在第一次执行y循环之后重新设置startX。就像这样:
for (var yCounter = startY; yCounter < _labelSettings.LabelPerColumn; yCounter++)
{
for (var xCounter = startX; xCounter < _labelSettings.ColumnsPerPage; xCounter++)
{
//do stuff
}
startX = 0;//reset so that the next execution starts at the beginning of the row
}这是逻辑的证明,尽管它在javascript中。
编辑:startY的计算被修改为正确处理,从最后一个数字开始是一行(感谢@Zach指出错误)
发布于 2013-11-01 16:12:48
x = num % grid width
y = num / grid widthnum是从%开始的数字,是模数运算符(除以后的余数)网格宽度是网格宽度:)
发布于 2013-11-01 16:44:03
这适用于基于1的值,如您在问题中所示:
int _cellsPerRow = 5; //number of cells per row
for (int startAt = 1; startAt <= 15; startAt++)
{
int startY = (startAt - 1) / _cellsPerRow + 1;
int startX = (startAt - 1) % _cellsPerRow + 1;
Console.WriteLine("{0}: {1}, {2}", startAt, startX, startY);
}(例如,"6: 1,2")
https://stackoverflow.com/questions/19730675
复制相似问题