Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
10 / 12 / 2
Регистрация: 13.01.2010
Сообщений: 363

Окно переписки с вкладками

13.03.2011, 18:50. Показов 4416. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю мессенджер, а в данный момент - окно для самой переписки.
С переписками в отдельных окнах проблем нет, несложно. А вот с одним окном, в котором будут создаваться вкладки с парочкой текстбоксов, возник вопрос как.
Понятно, что нужно использовать tabControl, но вот только как именно использовать в моей ситуации? ^^ буду рад любым подсказкам (можно даже с кодом))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.03.2011, 18:50
Ответы с готовыми решениями:

MVVM. Если окно содержит 1 TabControl, который в себе содержит много вкладок и в каждой может быть другой TabControl с вкладками
Я сделал так: Создал UserControl, в него поместил TabControl создал вкладки, во вкладки начал помещать нужные объекты (ListView, кнопки,...

Окно с вкладками - Изменение размеров окна не корректно обрабатывается
Всем привет, столкнулся с ошибкой-неошибкой. Мне нужна таблица, ширина столбцов которой должна меняться пропорционально ширине окна. ...

Создать окно произвольного размера, скрыть окно, показать окно, удалить окно.
Создать окно произвольного размера, скрыть окно, показать окно, удалить окно. Для создания окна необходимо произвести следующие...

29
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
04.05.2011, 15:10
Студворк — интернет-сервис помощи студентам
это я к примеру текст менял. то есть у меня же будут на вкладках richTextBox'ы, и вот для них я буду менять свойство текст когда сообщения будут приходить, то есть их надо будеть как то по другому обозначать!(( че та я совсем расстроился

Добавлено через 19 минут
о! родилась идея! надо к каждому tabPage создать индекс равный юзер ИД
tabControl1.SelectedIndex = userId;
работаю....
не правильно!
0
 Аватар для dzjundzja88
289 / 234 / 32
Регистрация: 09.02.2011
Сообщений: 435
04.05.2011, 15:30
У тебя есть имя табпейджа. Это "tab" + Convert.ToString(userId). Так используй следующее выражение
C#
1
     tabControl1.SelectedTab = (Controls["tab" + Convert.ToString(userId)] as TabPage);
Разберись полностью с примером. Здесь классно показана работа со словарём
ошибка кода
1
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
05.05.2011, 13:04
Прогресс:

сделал чтобы при повторном клике, вместо новой вкладки фокус перемещался на вкладку пользователя:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 try
            {
                tabControl1.SelectTab(("tab" + Convert.ToString(userId)));// фокус на вкладку, где имя 
                                                                         //вкладки ("tab" + Convert.ToString(userId))
                                                                            //выдает ошибку естественно если вкладки еще 
                                                                          //нет, и в обработчике исключения создаем 
                                                                           //вкладку
            }
            catch (Exception)
            {
                tabPage1 = new TabPage();
                this.tabPage1.Name = "tab" + Convert.ToString(userId);
                this.tabPage1.Text = Convert.ToString(userId);
                this.tabControl1.TabPages.Add(this.tabPage1);
                //this.tabControl1.SelectedTab= (Controls["tab" + Convert.ToString(userId)] as TabPage);
                tabControl1.SelectTab(("tab" + Convert.ToString(userId)));
 
                richTextBox1 = new RichTextBox();
                this.richTextBox1.Location = new System.Drawing.Point(6, 6);
                this.richTextBox1.Name = ""richTextBox1Recip"+ Convert.ToString(userId);
                this.richTextBox1.Size = new System.Drawing.Size(425, 96);
                this.richTextBox1.TabIndex = 0;
                this.richTextBox1.Text = "";
                this.tabPage1.Controls.Add(this.richTextBox1);
 
                richTextBox2 = new RichTextBox();
                this.richTextBox2.Location = new System.Drawing.Point(6, 108);
                this.richTextBox2.Name = "richTextBox2Send+ Convert.ToString(userId)";
                this.richTextBox2.Size = new System.Drawing.Size(425, 69);
                this.richTextBox2.TabIndex = 1;
                this.richTextBox2.Text = "";
                this.tabPage1.Controls.Add(this.richTextBox2);
                button1Otpravka = new Button();
                this.button1Otpravka.Location = new System.Drawing.Point(356, 190);
                this.button1Otpravka.Name =  "button1Otpravka" + Convert.ToString(userId);
                this.button1Otpravka.Size = new System.Drawing.Size(75, 23);
                this.button1Otpravka.TabIndex = 2;
                this.button1Otpravka.Text = "Отправить";
                this.button1Otpravka.UseVisualStyleBackColor = true;
                this.tabPage1.Controls.Add(this.button1Otpravka);
            }
Остался вопрос как взаимодействовать с элементами вкладок!
Для начала хотелось бы получать сообщения каждого юзера в созданной для него вкладке.
Код
(Controls["tab" + Convert.ToString(userId)] as TabPage).Text+=recipien//(переменная куда будут записываться новые сообщения)
должен помочь в этом, но не знаю как реализовать правильно!
Хелп ми то Беер!
0
 Аватар для dzjundzja88
289 / 234 / 32
Регистрация: 09.02.2011
Сообщений: 435
05.05.2011, 13:43
Здесь ты изменяешь текст, которым подписана вкладка(TabPage).
C#
1
(Controls["tab" + Convert.ToString(userId)] as TabPage).Text+=recipien
Зачем это тебе, у тебя же вкладка подписывается айди адресата. Тебе сообщения нужно размещать в ричтекстбокс.

Не по теме:

Как много ты узнал, пока писал код. Да?:)

1
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
05.05.2011, 15:01
Не то написал!

C#
1
Controls["richTextBox" + Convert.ToString(userId)] as TabPage).Text+=recipien;
заработался наверное

очень много! каждый день что-нибудь за узнаю, потому что каждый день новые тупики
0
 Аватар для dzjundzja88
289 / 234 / 32
Регистрация: 09.02.2011
Сообщений: 435
05.05.2011, 15:20
Я мало знаю о richtextbox. Так что почитай здесь и посмотри что он может делать.
http://msdn.microsoft.com/ru-r... xtbox.aspx


Научись пользоваться справкой msdn, очень полезная вещь
0
10 / 12 / 2
Регистрация: 13.01.2010
Сообщений: 363
06.05.2011, 22:24  [ТС]
DjadjaSem, давно не заглядывал в тему, поэтому только сейчас спрашиваю. Как ты сделал контакт-лист с картинками? Я listbox делал и сам отрисовывал как нужно. Есть более удобный способ?
0
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
10.05.2011, 09:01
R@z()r
В общем изначальноя я тоже делал в listBox, с ним вообще путнего ничего не вышло, поэтому сделал в dataGridView, оформил только как список а не таблица, пытался вставить туда картинку ничего не получалось. В итоге придумал вообще иной подход: за счет динамического добавления эл-тов. Получилось как div-контейнеры пракьтически

Так как работаю с MySql беру все необходимое оттуда и записываю в dataGridView(он скрытый), пытался без него получить все данные, но не получилось

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
private void SelectDataFromDBNewMes()
        {
            MySqlConnection myConnection1 = new MySqlConnection("Database=gb_testmsg;Data Source=mysql65.1gb.ru;User Id=gb_testmsg;Password=****");
            string SQL = "SELECT user_id,CONCAT_WS(' ',user_name,user_surname),SUBSTRING_INDEX(user_photo,';',1),user_last_visit FROM users_db INNER JOIN friends_db WHERE users_db.user_id=friends_db.id_friend AND friend_status=1 AND id_user=" + myUserId;
//SUBSTRING_INDEX(user_photo,';',1)-это имя картинки(их 3 в базе через ";")
            MySqlCommand myCommand = new MySqlCommand(SQL, myConnection);
            MySqlDataAdapter AdapterP = new MySqlDataAdapter();
            AdapterP.SelectCommand = myCommand;
            DataSet myDataSet = new DataSet();
            AdapterP.Fill(myDataSet);
            dataGridViewFriend.Columns.Clear();
            dataGridViewFriend.DataSource = myDataSet.Tables[0].DefaultView;
            count_Rows = dataGridViewFriend.Rows.Count;//считаю количество  контактов
            PictureBox[] pictureBox = new PictureBox[count_Rows];//создаю массив pictureBox"ов
            LinkLabel[] linklabel = new LinkLabel[count_Rows];//массив ссылок
            for (int i = 0; i < count_Rows; i++)
            {
                
                count_Id = new int[i];
                pictureBox[i] = new PictureBox();
                pictureBox[i].ImageLocation = "http://afisha.sbk/images/userphoto/" + (dataGridViewFriend.Rows[i].Cells[2].Value.ToString());// отображаю картинку
                pictureBox[i].Location = new System.Drawing.Point(1, (1 + 50) * i);
                pictureBox[i].Name = "pictureBox" + i;
                pictureBox[i].Size = new System.Drawing.Size(50, 50);
                pictureBox[i].TabIndex = 0;
                pictureBox[i].TabStop = false;
                pictureBox[i].BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
                
                panel1.Controls.Add(pictureBox[i]);
                user_name = dataGridViewFriend.Rows[i].Cells[1].Value.ToString();
                user_id = dataGridViewFriend.Rows[i].Cells[0].Value.ToString();
                linklabel[i] = new LinkLabel();
                linklabel[i].Text = dataGridViewFriend.Rows[i].Cells[1].Value.ToString();// отображаю имя
                linklabel[i].Name = "linklabelName" + i;
                linklabel[i].Location=new Point( 51,i*(1+50));
                linklabel[i].Size = new Size(120, 50);
                panel1.Controls.Add(linklabel[i]);
                linklabel[i].BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
                linklabel[i].LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(linkLabel_LinkClicked);// это функция клика по ссылке, далее смотри как сделать чтобы для каждого контакта передавались только его данные
                linklabel[i].Tag = (dataGridViewFriend.Rows[i].Cells[0].Value.ToString());// сюда записываю ИД контакта
                
            }
            myConnection1.Close();
        }
А вот обработка клика:
C#
1
2
3
4
5
6
7
8
9
10
11
12
 
protected void linkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)//на форме с контактами
        {
            string s = Convert.ToString(((LinkLabel)sender).Tag);//это ИД юзера,sender передает тэг
            string user_name2 = Convert.ToString(((LinkLabel)sender).Text);//это его имя
            labelmyNewMessage.Text = user_name2;//строчка для проверки корректности
            formChat.user_name = user_name2;//имя на форму чата
            formChat.myUserId= myUserId;//Мой ИД
            formChat.Show();
                formChat.userId = Convert.ToInt32(s);//ИД на форму чата
                formChat.TabPageNew(s);//метод создания вкладки, записываю туда s- он будет выполнять роль ключа
           }
по хорошему бы сделать panel для каждого контакта чтобы на нее тыкать а не линклабел, но чет руки не дошли, с чатом запарок много. Кстати чат я реализовал все таки, тоже могу помоч!

P.s. если будешь делать через dataGridView, в его свойствах измени AllowUserToAddRows на false, ато будет ошибка
0
 Аватар для -=G-L-A-V-A-K=-
18 / 18 / 3
Регистрация: 16.02.2010
Сообщений: 243
10.05.2011, 10:15
Возможно сейчас испорчу всю картину, но есть такая полезная вещь как MDI-окна
0
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
10.05.2011, 15:17
С mdi я не работал, поэтому делаю так, сколько программистов столько решений
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.05.2011, 15:17

Алгоритм переписки
Можете подсказать, как правильно сделать алгоритм переписки. На данный момент ситуация такая: есть recyclerview в котором отображается...

Сохранение переписки вк
Всем привет) Задача заключается в следующем. Можно ли создать скрипт, который будет в режиме оффлайн отслеживать переписку человека в вк,...

Удаление собственной переписки
Привет, хочу сделать удаление переписки. Обработчик такой: site.com/message/delete/?my_id=&amp;from_id=. Но тогда каждый сможет удалить...

История переписки вконтакте
String urls = &quot;https://api.vk.com/method/&quot;+ &quot;messages.getHistory?&quot;+ &quot;oid&quot;+ oid+ ...

Скайп, защита переписки
Уважаемые, господа. Помогите решить делему. У нас на рабочих компьютерах стоит скайп. Иногда в процессе работы, необходимо переговорить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru