所以我试图在visual studio 2010中的富文本框中替换一行。对于一个项目,我正在创建一个菜单系统,当一个项目被选中时,我需要更新显示数量的文本框那个项目。我不知道项目在列表中的具体位置,并且可能有多个项目显示相同的数字,因此我无法使用.replace方法。我可以得到项目所在的行号,但是当我尝试使用我用来查找行号的索引时,我得到一个错误,说“StartIndex不能小于零”。这是我到目前为止的代码:
//跟踪每个项目的数量
int[] mainItems = new int[10];
//function for menu item buttons
private void MenuButtonClick(object sender, EventArgs e)
{
int index = 0;
Button btn = (Button)sender;
string s = btn.Name.ToString();
//if item doesnt already exist on order
if (!textBoxItems.Text.Contains(s))
{
textBoxItems.Text += "\r\n• " + s;
//track num of each item
switch (s)
{
case "Tiramisu": mainItems[0]++;
break;
case "Lazania": mainItems[1]++;
break;
}
textBoxCount.Text += "\r\n(1)";
}
else
{
int itemID = 0;
switch (s)
{
case "Tiramisu": mainItems[0]++;
itemID = 0;
break;
case "Lazania": mainItems[1]++;
itemID = 1;
break;
}
int lastIndex = 0;
//get line number of item
do
{
index = textBoxItems.Find(s, index + 1, RichTextBoxFinds.MatchCase);
if (index != -1)
{
lastIndex = index;
}
} while ((index != -1));
//int lineNum = textBoxItems.GetLineFromCharIndex(index);
//MessageBox.Show("" + lineNum);
textBoxCount.Text.Remove(lastIndex, 2);
textBoxCount.Text.Insert(lastIndex, "(" + mainItems[itemID] + ")");
}
任何帮助表示赞赏!提前谢谢
答案 0 :(得分:0)
问题是你循环到index == -1
while ((index != -1));
然后立即使用该索引
int lineNum = textBoxItems.GetLineFromCharIndex(index);
我不确定while循环的逻辑究竟是什么,但乍一看,如果index == -1,你可能想要突破。或者跟踪循环外的最后一个非负指数。
<强>更新强>
要查找用户刚刚单击的项目,您需要更改循环以记录最后一个非-1的索引。 while循环的目的是查找s的最后一次出现,但是你必须在一个单独的变量中记录最后一次有效的出现(下面代码中的lastIndex)。您还必须在循环完成后测试实际发现的内容。
以下是我将如何实现此逻辑:
int lastIndex = -1;
//get line number of item
do
{
index = textBoxItems.Find(s, index + 1, RichTextBoxFinds.MatchCase);
if (index != -1) {
lastIndex = index;
}
} while ((index != -1));
if (lastIndex !+ -1) {
int lineNum = textBoxItems.GetLineFromCharIndex(lastIndex);
//messageBox.Show(""+lineNum);
textBoxCount.Text.Remove(lastIndex, 3);
textBoxCount.Text.Insert(lastIndex, "(" + mainItems[itemID] + ")");
}