Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вернуться в функцию 
V
    Опции темы
okaton
Дата 10.12.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



Подскажите как можно вернуться обратно в функцию, в то место откуда был совершен выход


Код

        bool search = false;   
        string _search = null; 
        private void toolStripButton5_Click(object sender, EventArgs e)
        {
            if (toolStripTextBox1.Text.Trim() != "") 
            {
                search = true;
                this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.RowHeaderSelect;


                if (toolStripTextBox1.Text == _search) 
                {
                    //здесь как-то нужно вернуться обратно в цикл функции
                }
                else 
                {
                    _search = Search();
                    search = false;
                }               
            }
        }

        public string Search()
        {
            string subsearch = toolStripTextBox1.Text.Trim();         
            
            for (int r = 0; r < dataGridView1.Rows.Count; r++)
            {
                for (int k = 1; k < dataGridView1.ColumnCount; k++)
                {
                    if (Convert.ToString(dataGridView1.Rows[r].Cells[k].Value).ToLower().Contains(subsearch.ToLower()))
                    {
                        dataGridView1.CurrentCell = dataGridView1.Rows[r].Cells[k];
                        return subsearch;                    
                    }                     
                }
            }
            return "Превед!"; 
        }


Это сообщение отредактировал(а) okaton - 10.12.2008, 14:31
PM MAIL   Вверх
okaton
Дата 10.12.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



А вообще такое действие возможно? Красоты кода ради, хочется разобраться в этом вопросе... Если нет, то я напишу 2 функцию. 
Отзовитесь кто знает 
PM MAIL   Вверх
EgoBrain
Дата 10.12.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: 1
Всего: 2



Может стоит использовать какой-то флаг перехода, передаваемый в аргументы функции, а потом switch-ить его, или метки? А куда собственно необходимо перейти?

Добавлено @ 14:52
Код

        int k1, r1 = 0;

        bool search = false;   
        string _search = null; 
        private void toolStripButton5_Click(object sender, EventArgs e)
        {
            if (toolStripTextBox1.Text.Trim() != "") 
            {
                search = true;
                this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.RowHeaderSelect;
                if (toolStripTextBox1.Text == _search) 
                {
                    k1 = [нужное число];//здесь как-то нужно вернуться обратно в цикл функции
                    r1 = [нужное число];
                    Search();
                }
                else 
                {
                    _search = Search();
                    search = false;
                }               
            }
        }
        public string Search()
        {
            string subsearch = toolStripTextBox1.Text.Trim();         
            
            for (int r = r1; r < dataGridView1.Rows.Count; r++)
            {
                for (int k = k1; k < dataGridView1.ColumnCount; k++)
                {
                    if (Convert.ToString(dataGridView1.Rows[r].Cells[k].Value).ToLower().Contains(subsearch.ToLower()))
                    {
                        dataGridView1.CurrentCell = dataGridView1.Rows[r].Cells[k];
                        return subsearch;                    
                    }                     
                }
            }
            return "Превед!"; 
        }


Это сообщение отредактировал(а) EgoBrain - 10.12.2008, 14:53
PM MAIL ICQ Skype   Вверх
NightmareZ
Дата 10.12.2008, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 1
Всего: 13



Цитата(okaton @  10.12.2008,  14:34 Найти цитируемый пост)
А вообще такое действие возможно?


Возможно. Гугли слово "yield".


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
okaton
Дата 10.12.2008, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



Перейти надо в это место

Код

if (Convert.ToString(dataGridView1.Rows[r].Cells[k].Value).ToLower().Contains(subsearch.ToLower()))
                    {
                        dataGridView1.CurrentCell = dataGridView1.Rows[r].Cells[k];
                        return subsearch;  
                        //переход сюда                  
                    }    


если срабатывает это условие if (toolStripTextBox1.Text == _search)

смысл такой программа организует поиск, в else происходит первый заход, далее в функцию и нахождение первого совпадения. Далее (toolStripButton5_Click...) если значение в toolStripTextBox1.Text не изменяется, то срабатывает условие toolStripTextBox1.Text == _search
и было бы хорошо вернуться обратно в функцию.

Если такое выполнить не возможно, то план клонировать функцию, объявить глобальные переменные r и k. В 1 функции обнулять их при входе, во второй использовать как есть.

Хочется узнать вообще это возможно вернуться обратно в функцию, в тело цикла после return...

Кстати по поводу меток. Оставлял их на черный день, но тут решил попробовать... Почему-то в C# они работают в пределах функции, но не дальше  smile 

Это сообщение отредактировал(а) okaton - 10.12.2008, 22:53
PM MAIL   Вверх
okaton
Дата 10.12.2008, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



Цитата

Возможно. Гугли слово "yield". 


 smile А вот это по ходу правильное направление, завтра "отведаю" отпишусь
PM MAIL   Вверх
okaton
Дата 11.12.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



Скажите а yield работает только с IEnumerable или с чем то еще?

MSDN: - Использование небезопасных блоков не допускается
кхм, а какие безопасные?
PM MAIL   Вверх
Ram1reS
Дата 11.12.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 25.4.2008
Где: Москва

Репутация: 2
Всего: 5



Цитата(okaton @ 11.12.2008,  15:38)
Скажите а yield работает только с IEnumerable или с чем то еще?

MSDN: - Использование небезопасных блоков не допускается
кхм, а какие безопасные?

Иммется ввиду managed(safe-безопасный) и unmanaged(unsafe-небезопасный).
--------------------
 
PM MAIL ICQ   Вверх
okaton
Дата 11.12.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



Я так понял, что он все таки работает только с перечислениями. 
Это мне не подходит, у меня функция определена как string, но дело даже не в этом, мне вернуться в функцию нужно по моему запросу, а не как в yield.

Есть еще какие-то варианты?
PM MAIL   Вверх
thomas
Дата 11.12.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



okaton, 
рефлексия.

повторный вызов функции в самой функции.
Применяеться как раз при сортировке.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
okaton
Дата 11.12.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



thomas, честно придался гуглингу, но ничего полезного для себя выяснить не смог, можно поконкретнее пожалуйста

Код

public string Search()
        {
            ...       
            for (int r = 0; r < dataGridView1.Rows.Count; r++)
            {for (int k = 0; k < dataGridView1.ColumnCount; k++)
                {if (Convert.ToString(dataGridView1.Rows[r].Cells[k].Value).ToLower().Contains(subsearch.ToLower()))
                    {dataGridView1.CurrentCell = dataGridView1.Rows[r].Cells[k];
                        return subsearch;   // здесь я выхожу из функции
                        //сюда нужно вернуться                 
                    }
                  }} return "Превед!"; 
        }


Код

private void toolStripButton5_Click(object sender, EventArgs e)
        {
            ...
                {
                    //Повторный заход, здесь как-то нужно вернуться обратно в цикл функции (после return subsearch;)
                }
                else 
                {
                    _search = Search(); //Первый вход в Search() (в начало функции)                    
                } }          
            
        




Это сообщение отредактировал(а) okaton - 11.12.2008, 18:34
PM MAIL   Вверх
thomas
Дата 11.12.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



okaton, 
вот пример рефлексии при быстрой сортировке
Код

Public Sub Quicksort(ByVal tabel() As Integer, ByVal Li As Integer, ByVal Re As Integer)
        Dim Hli, Hre, mid As Integer
        Hli = Li : Hre = Re
        mid = tabel((Hli + Hre) / 2)
        While Hli <= Hre
            While tabel(Hli) < mid
                Hli += 1
            End While
            While tabel(Hre) > mid
                Hre -= 1
            End While
            If Hli <= Hre Then
                verwissel(tabel, Hli, Hre)
                Hli += 1 : Hre -= 1
            End If
        End While
        If Li < Hre Then
            Quicksort(tabel, Li, Hre)
        End If
        If Hli < Re Then
            Quicksort(tabel, Hli, Re)
        End If
    End Sub

    Private Sub verwissel(ByVal tabel() As Integer, ByVal ind1 As Integer, ByVal ind2 As Integer)
        Dim hulp As Integer
        hulp = tabel(ind1)
        tabel(ind1) = tabel(ind2)
        tabel(ind2) = hulp
    End Sub


Первый метод основной(проводит сортировку массива), второй вспомогательный(меняет местами значения в массиве)
В основном методе применена рефлексия, т.е. повторный вызов самого метода.
Единственный ньюанс в повторном вызове это второй и третий параметры(они определяют где нужно проводить сортировку: нижняя и верхняя границы массива)

Прикинь как надо вызывать повторно функцию поиска в твоем случае. Единственное что хочу порекомендовать, это по возможности убрать весь код из обработчика события нажатия кнопки, кроме определения параметров поиска и вызова функции поиска с заданными параметрами. Все условия по прекращению или повторному вызову должны быть определены в самой функции происка.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Ram1reS
Дата 11.12.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 25.4.2008
Где: Москва

Репутация: 2
Всего: 5



Цитата(thomas @ 11.12.2008,  18:02)
okaton, 
рефлексия.

повторный вызов функции в самой функции.
Применяеться как раз при сортировке.

Может быть все-таки рекурсия?  smile 
--------------------
 
PM MAIL ICQ   Вверх
okaton
Дата 11.12.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 24.11.2006

Репутация: нет
Всего: нет



Спасибо конечно smile, а как же я продолжу поиск из функции; без нажатия кнопки?
PM MAIL   Вверх
thomas
Дата 11.12.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Ram1reS, 
ты прав конечно, РЕКУРСИЯ.

okaton, 
упс, описался.

Цитата

а как же я продолжу поиск из функции; без нажатия кнопки? 

в обработчике события нажатия кнопки ты определяешь что и где искать и вызываешь функцию поиска с заданными параметрами.
А она уже выполняет поиск пока не найдет. При этом сама себя вызывает с видоизмененными параметрами для дальнейшего поиска.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0744 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.