我正在编写一个应用程序,我必须将街道地址放置在预先定义的标签表上。该标签页有 3 列和 10 行。我有正确创建标签的循环,但需要允许用户能够选择在工作表上开始使用哪个标签。我本以为这将是一个简单的数学矩阵方程,但我无法想出或找到解决方案。
这是一个例子:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
鉴于上面的矩阵,假设用户决定从#6 开始。我需要能够告诉我的循环从该位置开始:col:1 row: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();
}
假设您知道每行中的单元格数量(我认为应该是
_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
}
编辑:
startY
的计算已被修改,以正确处理从最后一个数字开始的行(感谢@Zach指出错误)
x = num % grid width
y = num / grid width
num 是开始的数字 % 是模运算符(除后的余数) 网格宽度就是网格宽度:)
这适用于从 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”)
解决此问题的更通用方法是将要跳过的数字打印为空白标签。如果您没有上述控件,只需生成带有 6 个空标签的数据即可。每次都有效。
在 VB.NET 中,如果有一个 100 元素的矩阵(网格),有 10 行和 10 列,则这 100 个元素(i=0,1,...,99)中每个元素的行和列值为给出者:
For i = 0 To 99
MsgBox("row: " & Math.Ceiling((i + 1) / 10) & " col: " & i Mod 10 + 1)
Next