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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> textbox в цикле 
V
    Опции темы
Ronin08
Дата 15.3.2010, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброго времени суток!
необходимо пройтись по определенным textbox на форме имена которых отличаются последней цифрой (tbx_esr1, ..., tbx_esr15) в цикле!

--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
CYBERDREAM
Дата 15.3.2010, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



Код

            List<TextBox> list = new List<TextBox>();

            foreach (var control in Controls)
                if (control is TextBox && ((TextBox)control).Name.StartsWith("tbx_esr"))
                    list.Add((TextBox)control);

Если фрейм 3-й, то можно поулчить список TextBox'ов
Код

List<TextBox> list = this.Controls.OfType<TextBox>().ToList();

а потом уже смотреть на имена


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
Ronin08
Дата 16.3.2010, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



CYBERDREAM, спасибо, я так и делал, просто не учел, что мои контролы находятся в GroupBox на TabPage, поэтому надо было искать так
Код

 foreach (Control control in gbx_sr.Controls)

--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Ronin08
Дата 16.3.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



все-таки расскажу подробней.
вот код
Код

List<TextBox> list = new List<TextBox>();
                foreach (Control control in gbx_sr.Controls)
                    if (control is TextBox && ((TextBox)control).Name.StartsWith("tbx_esr"))
                        list.Add((TextBox)control);
                list.Reverse();

                CurrencyManager cm = (CurrencyManager)this.BindingContext[sr_dt];
                cm.Position = 0;

                for (int i = 0; i < 15; i++)
                {
                    list[i].DataBindings.Add("Text", sr_dt, "showroom");
                    list[i + 15].DataBindings.Add("Text", sr_dt, "place_total");
                    cm.Position++;
                }

в цикле for() я пытаюсь всем парам (tbx_esr, tbx_esrс, которые находятся в List<>) прибиндить table st_dt, но в списке list все textbox-ы не отсартированы по имени! как это можно сделать?
Пары Textbox-ов выглядядт так (tbx_esr1, tbx_esrc1; tbx_esr2, tbx_esrc2; ........)

Это сообщение отредактировал(а) Ronin08 - 16.3.2010, 15:45
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Ram1reS
Дата 16.3.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Попробуйте, что-то в этом духе.
Код

// список для tbx_esrX
List<TextBox> esrList = new List<TextBox>();
// список для tbx_esrcX
List<TextBox> esrcList = new List<TextBox>();


foreach (TextBox textBox in gbx_sr.Controls // из всех контролов
                            .OfType<TextBox>() // берем текстбоксы
                            .Where(tb=>tb.Name.StartsWith("tbx_esr")) // с именем начинающемся на tbx_esr
                            .OrderByDescending(tb=>tb.Name)) // сортируем по убыванию (чтобы потом не делать Reverse)
{
    // раскидываем текстбоксы по спискам
    if(textBox.Name.Contains("tbx_esrc"))
        esrcList.Add(textBox);
    else
        esrList.Add(textBox);
}
// Реверсить не нужно т.к. сортировали по убыванию
//esrList.Reverse();
//esrcList.Reverse();

CurrencyManager cm = (CurrencyManager)this.BindingContext[sr_dt];
cm.Position = 0;

// биндим
for (int i = 0; i < 15; i++)
{
    esrList[i].DataBindings.Add("Text", sr_dt, "showroom");
    esrcList[i].DataBindings.Add("Text", sr_dt, "place_total");
    cm.Position++;
}

--------------------
 
PM MAIL ICQ   Вверх
Ronin08
Дата 16.3.2010, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ram1reS, 
что это за конструкция такая?
Код

TextBox textBox in gbx_sr.Controls // из всех контролов
                            .OfType<TextBox>() // берем текстбоксы
                            .Where(tb=>tb.Name.StartsWith("tbx_esr")) // с именем начинающемся на tbx_esr
                            .OrderByDescending(tb=>tb.Name)) // сортируем по убыванию (чтобы потом не делать Reverse)

у меня 2й Фрейм
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Ram1reS
Дата 16.3.2010, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Извиняюсь, это LINQ(3.5FW), но сути не меняет.
Можно, например, так переписать кусок:
Для сортировки списка вспомогательный класс
Код

class TextBoxDescendingComparer : IComparer<TextBox>
    {
        #region IComparer<TextBox> Members

        public int Compare( TextBox x , TextBox y )
        {
            return y.Name.CompareTo( x.Name );
        }

        #endregion
    }

Переписываем кусок:
Код

foreach (Control control in gbx_sr.Controls)
{
    TextBox textBox = control as TextBox;
    if(textBox==null || !textBox.Name.StartsWith("tbx_esr")) // не текстбокс или не тот текстбокс
        continue;
    
    // раскидываем текстбоксы по спискам
    if(textBox.Name.Contains("tbx_esrc"))
        esrcList.Add(textBox);
    else
        esrList.Add(textBox);
}

TextBoxDescendingComparer comparer = new TextBoxDescendingComparer(); // вспомогательный класс для сортировки
esrList.Sort(comparer); // сортируем
esrcList.Sort(comparer); // сортируем
// Реверсить не нужно т.к. сортируем по убыванию

Дальше так же как в прошлом моем посте.



--------------------
 
PM MAIL ICQ   Вверх
Ronin08
Дата 17.3.2010, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ram1reS, с записью в список textbox-ов все получилось! Спасибо.
А вот с databinding проблема. 
Выводится во всех textbox-ах только последняя запись из datatable sr_dt
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Ram1reS
Дата 17.3.2010, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

CurrencyManager cm = (CurrencyManager)this.BindingContext[sr_dt];
cm.Position = 0;

// биндим
for (int i = 0; i < 15; i++)
{
    esrList[i].DataBindings.Add("Text", sr_dt, "showroom");
    esrcList[i].DataBindings.Add("Text", sr_dt, "place_total");
    cm.Position++;
}


Что такое sr_dt? List<???>?
Для вывода значений из списка лучше использовать DataGridView/ListBox и т.д.
Текстбоксы в биндинге обычно применяются для вывода значений одного объекта(например, пользователь выбирает из списка объект и его поля выводятся в текстбокс).
Если хотите текстбоксы, то имхо лучше обойтись без биндинга:
Код

// заполнение текстбоксов
for (int i = 0; i < 15; i++)
{
    esrList[i].Text= sr_dt[i].showroom;
    esrcList[i].Text= sr_dt[i].place_total;
}

.....

// если надо сохранить изменения
for (int i = 0; i < 15; i++)
{
    sr_dt[i].showroom = esrList[i].Text;
    sr_dt[i].place_total = esrcList[i].Text;
}


Это сообщение отредактировал(а) Ram1reS - 17.3.2010, 10:08
--------------------
 
PM MAIL ICQ   Вверх
Ronin08
Дата 17.3.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ram1reS,  все-таки видимо сортируется список textbox - ов не верно
esrList[0] соответствует tbx_esr9 
esrList[1] соответствует tbx_esr8

esrList[14] соответствует tbx_esr1  

Это связано с тем, что сортируется имя, т.е. строковое значение.
а после строки "tbx_esr1" будет стоять не "tbx_esr2",а "tbx_esr10"

Это сообщение отредактировал(а) Ronin08 - 17.3.2010, 11:41
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Ram1reS
Дата 17.3.2010, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вместо TextBoxDescendingComparer делаем класс:
Код

 public class NaturalSortTextBoxDescendingComparer :IComparer<TextBox>
    {
        private int Compare( string x, string y )
        {
            if ( x == y )
                return 0;

            string[] x1, y1;

            if ( !table.TryGetValue( x, out x1 ) )
            {
                x1 = Regex.Split( x.Replace( " ", "" ), "([0-9]+)" );
                table.Add( x, x1 );
            }

            if ( !table.TryGetValue( y, out y1 ) )
            {
                y1 = Regex.Split( y.Replace( " ", "" ), "([0-9]+)" );
                table.Add( y, y1 );
            }

            for ( int i = 0; i < x1.Length && i < y1.Length; i++ )
            {
                if ( x1[ i ] != y1[ i ] )
                    return PartCompare( x1[ i ], y1[ i ] );
            }

            if ( y1.Length > x1.Length )
                return 1;
            else if ( x1.Length > y1.Length )
                return -1;
            else
                return 0;
        }

        private static int PartCompare( string left, string right )
        {
            int x, y;
            if ( !int.TryParse( left, out x ) )
                return left.CompareTo( right );

            if ( !int.TryParse( right, out y ) )
                return left.CompareTo( right );

            return x.CompareTo( y );
        }

        private Dictionary<string, string[]> table = new Dictionary<string, string[]>();

        #region IComparer<TextBox> Members

        public int Compare( TextBox x, TextBox y )
        {
            return Compare( y.Name, x.Name );
        }

        #endregion
    }



И меняем строчки:
Код

TextBoxDescendingComparer comparer = new TextBoxDescendingComparer(); // вспомогательный класс для сортировки
esrList.Sort(comparer); // сортируем
esrcList.Sort(comparer); // сортируем


на

Код

NaturalSortTextBoxDescendingComparer comparer = new NaturalSortTextBoxDescendingComparer(); // вспомогательный класс для сортировки
esrList.Sort(comparer); // сортируем
esrcList.Sort(comparer); // сортируем


ЗЫ. Код NaturalSortTextBoxDescendingComparer взял отсюда и немножко подкрутил.
--------------------
 
PM MAIL ICQ   Вверх
Ronin08
Дата 18.3.2010, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ram1reS,  благодарю, но все-таки решил использовать datagridview!
с его помощью удобно не только выводить данные. но и удалять, обновлять;)
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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