заменить строку из расширенного текстового поля в C # - PullRequest
1 голос
/ 29 ноября 2011

Итак, я пытаюсь заменить строку в расширенном текстовом поле в 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] + ")");

        }

Любая помощь приветствуется! заранее спасибо

1 Ответ

0 голосов
/ 29 ноября 2011

Проблема в том, что вы зацикливаетесь до индекса == -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] + ")");
        }
...