10 / 12 / 2
Регистрация: 13.01.2010
Сообщений: 363
1

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

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

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

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

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

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

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

29
86 / 85 / 13
Регистрация: 21.10.2010
Сообщений: 349
13.03.2011, 19:00 2
Создавай массив текстбоксов.
0
10 / 12 / 2
Регистрация: 13.01.2010
Сообщений: 363
13.03.2011, 19:18  [ТС] 3
Vangok, ну массив tabPage тогда, и помещать текстбоксы в tabpage. Только как tabpage создавать и удалять в tabcontrol'е??
0
86 / 85 / 13
Регистрация: 21.10.2010
Сообщений: 349
13.03.2011, 19:56 4
Добавление:
C#
1
2
3
4
5
6
private TabPage tabPage1;
private TabPage tbaPage2;
tabPage1 = new TabPage();
tabPage2 = new TabPage();
tabControl1.TabPages.Add(tabPage1);
tabControl1.TabPages.Add(tabPage2);
Удаление:
C#
1
tabControl1.TabPages.Remove(tabPage2);
Добавлено через 4 минуты
или
C#
1
2
3
4
5
private TabPage tabPage1;
private TabPage tbaPage2;
tabPage1 = new TabPage();
tabPage2 = new TabPage();
tabControl1.Controls.AddRange(new Control[] {tabPage1,tabPage2});
или
C#
1
2
3
4
5
6
7
TabPage [] pages = new TabPage [] {
                                        new TabPage("Имя страницы"),
                                        new TabPage("Имя страницы"),
                                        new TabPage("Имя страницы")
                                  };
 
tabControl1.TabPages.AddRange(pages);
Удаление:
C#
1
tabControl1.TabPages.RemoveAt(0);
Добавлено через 2 минуты
Добавление в TabPage
C#
1
2
3
private Label lbl_ = new Label();
private TextBox txt = new TextBox();
pages[1].Controls.AddRange(new Control[] {lbl_,txt});
На счет этого точно не уверен. Но должно работать. Правда придется выравнивание делать и все такое.
1
10 / 12 / 2
Регистрация: 13.01.2010
Сообщений: 363
13.03.2011, 20:02  [ТС] 5
Vangok, выравнивание, в смысле контролов во вкладке? можно им location и size задать просто, и все.
0
86 / 85 / 13
Регистрация: 21.10.2010
Сообщений: 349
13.03.2011, 20:04 6
Цитата Сообщение от R@Z()r Посмотреть сообщение
Vangok, выравнивание, в смысле контролов во вкладке? можно им location и size задать просто, и все.
ну да
0
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
03.05.2011, 09:17 7
Я тоже сейчас пишу мессенджер, и тоже мучаюсь с созданием вкладок.Выбираю адресата в первой форме, открывается вторая форма и на нее передается ид пользователя. Вот как мне организовать появление вкладок для каждого адресата, и чтобы ид к каждой вкладке передавался?

помогите пожалуйста, желательно с кодом, ато я пока тока учусь!

Пока работает так, при клике на каждого адресанта:
C#
1
2
3
4
5
string s = Convert.ToString(((LinkLabel)sender).Tag);
            labelmyNewMessage.Text = s;
            FormChat formChat = new FormChat();
            formChat.userId = Convert.ToInt32(s);
            formChat.Show();
...то есть новое окно формы.

А хочу так:
1. при клике, открывается форма, динамически добавляется вкладка с элементами, где ид юзер1
2. при повторном клике на другом адресанте, создается другая вкладка где ид юзер5 к примеру
0
10 / 12 / 2
Регистрация: 13.01.2010
Сообщений: 363
03.05.2011, 18:29  [ТС] 8
DjadjaSem, надо в форме создать паблик функцию, которая будет вкладку создавать, и вызывать её как-то так:
C#
1
formChat.CreateTab(Convert.ToInt32(s));
Ну и форма чтобы не создавалась каждый раз, это обьявить за функцией просто
C#
1
FormChat formChat;
Создать форму при загрузке самого мессенджера
C#
1
formChat = new FormChat();
Ну и прятать/показывать её когда надо

ADD:
объяснил я, наверное, не очень, поэтому держи проект с примером
Вложения
Тип файла: rar messenger.rar (42.3 Кб, 50 просмотров)
1
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
04.05.2011, 09:04 9
Спасибо! Хотя я уже сам сделал это, но очень пригодилась обработка закрытия формы!

Теперь следующий вопрос:
При повтором клике на адресанте, необходимо сделать не появление нового tabPage, а просто перевода фокуса на уже созданную tabPage этого юзера.

Кстати если тебе интересна еще эта тема, могу показать как сделать вывод юзеров списком и с картинками по типу как в майл агенте
0
286 / 231 / 33
Регистрация: 09.02.2011
Сообщений: 435
04.05.2011, 10:01 10
Запоминайте какой табпейдж относится к какому адресату и переходите на него
C#
1
tabControl1.SelectTab(1);
0
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
04.05.2011, 10:21 11
А как сделать чтобы новые вкладки не открывались,если для этого пользователя уже открыта вкладка.
вот думаю может значения передаваемые при клике, записывать в массив и если в данном массиве нет такого значения - создавать вкладку, а если нет, то делать selectIndex?? как тогда массив заполнять?
0
286 / 231 / 33
Регистрация: 09.02.2011
Сообщений: 435
04.05.2011, 10:38 12
Есть такая интересная штука как словарь, где задается пара ключ-значение. Допустим ключ - это id адресата, а значение - это имя табпейджа. У тебя есть id и создавая табпейдж у тебя есть его имя, вот и добавляй в словарь. Потом будеш просто проверять табпейдж на существование. Может есть и проще способ. Я выразил свое мнение. http://msdn.microsoft.com/ru-r... ctb9c.aspx
1
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
04.05.2011, 13:23 13
Не ты правильно говоришь, я так и пытаюсь сделать: передаю id контакта, добавляю этот id к названию tabPage, написал
if (tabPage.Name!=tabPage)
{
добавить вкладку
}
иначе
куй! селект!

...но не выходит, делает тока 1 вкладку тогда, то бишь я наверное создаю не правильно tabPage

посмотри плиз, может у тебя че получится:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 public partial class FormChat : Form
    {
 
        public FormChat()
        {
            InitializeComponent();
        }
        int userId2 = 0;
      
        public Int32 userId { get; set; }
        public void TabPageNew()// метод для создания вкладки, запускается из главной формы
        {
            TabPage tabPage = new TabPage("!" + userId);
            tabControl1.TabPages.Add(tabPage);
            tabControl1.SelectedTab = tabPage;// тоже думаю не совсем правильно, но работает, переводит фокус на новый табПэйдж
        }
Добавлено через 2 часа 19 минут
столкнулся еще с проблемой:

tabPage = new TabPage("tab" + userId);
tabPage.Name = "tab" + userId;
tabPage.Text = "tab" + userId;
tabControl1.TabPages.Add(tabPage);
tabControl1.SelectedTab = tabPage;

при таком раскладе действия могу проводить только с tabPage, если пишу например tab1( tabPage.Name = "tab" + userId компилятор ругается мол объекта не существует, значит надо как то имя давать по другому
0
286 / 231 / 33
Регистрация: 09.02.2011
Сообщений: 435
04.05.2011, 13:32 14
Это все на одной форме происходит?

если пишу например tab1( tabPage.Name = "tab" + userId компилятор ругается мол объекта не существует, значит надо как то имя давать по другому
Что ты этим хочешь сделать?
0
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
04.05.2011, 13:38 15
Id юзера беру с первой формы(список контактов) только, остальное происходит на второй(окно чата)

Добавлено через 2 минуты
не дописал маленько, то есть компилятор ругается на tab1.Text="имя_юзера" например и правильно делает потому что его как бы еще нет, но он же будет!
0
286 / 231 / 33
Регистрация: 09.02.2011
Сообщений: 435
04.05.2011, 13:41 16
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 public partial class FormChat : Form
    {
 
        public FormChat()
        {
            InitializeComponent();
        }
        int userId2 = 0;
      
        public Int32 userId { get; set; }
        public void TabPageNew()// метод для создания вкладки, запускается из главной формы
        {
            TabPage tabPage = new TabPage("!" + userId);
            tabControl1.TabPages.Add(tabPage);
            tabControl1.SelectedTab = tabPage;// тоже думаю не совсем правильно, но работает, переводит фокус на новый табПэйдж
        }
Это у тебя первая форма?

А где находятся табконтрол? На какой форме? И вообще опиши подробно что и куда передается, и что где делается, а если продемонстрируешь код, то вообще супер.

Ты думаешь по чему кроме меня все молчат? По тому, что не совсем ясна задача, тяжело все кусочки собрать в кучу и понять, что тебе нужно.
0
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
04.05.2011, 14:06 17
учту!

итак создается первая форма

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using ...
 
namespace Afi_Sha_version_1._1._0._0
{
    public partial class MainForm : Form
    {
        FormChat formChat;
        int count_Rows;
        int[] count_Id;
        int unixTime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
        public String myUserId { get; set; }
        public Point mouse_offset;
        public MainForm()
        {
            InitializeComponent();
        }
        public void FormPosition()...
        
        public void InformatioFromMainForm()...
        
        public void MyFriends()//Строки подключения и создание списка юзеров
        {
                        string Connect = "Database=gb_testmsg;Data Source=mysql65.1gb.ru;User Id=gb_testmsg;Password=***";
            MySqlConnection myConnection = new MySqlConnection(Connect);
            myConnection.Open();
            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;
            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];
            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]);
 
                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());
            }
        }
        void linkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)//обработка нажатия
        {
            string s = Convert.ToString(((LinkLabel)sender).Tag);
            labelmyNewMessage.Text = s;//проверяю правильный ли ИД
            formChat.Show();
formChat.userId = Convert.ToInt32(s);//Передача ИД юзера!
                formChat.TabPageNew();// запускаю метод на 2 форме
           }
       
  private void MainForm_Load(object sender, EventArgs e)
        {
            formChat = new FormChat();
            FormPosition();
            InformatioFromMainForm();
            MyFriends();
        }
 
   }
}
https://www.cyberforum.ru/atta... 1304503553

Теперь код второй формы при клике контакта:

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
using ...
 
namespace Afi_Sha_version_1._1._0._0
{
    public partial class FormChat : Form
    {
        public FormChat()
        {
            InitializeComponent();
        }
        TabPage tabPage;// Вкладки
        public Int32 userId { get; set; }//ИД контакта
        public Int32 count;//кол-во контактов(не нужно пока)
        
        public void TabPageNew()//Метод добавления вкладок
        {
           
                TabPage tabPage = new TabPage("tab" + userId);//заодно свойство Name задаю
tabPage.Text="tab" + userId;//имя вкладки
            tabControl1.TabPages.Add(tabPage);
            tabControl1.SelectedTab = tabPage;//переводит фокус на новую вкладку
        }
        private void FormChat_Load(object sender, EventArgs e)
        {
 
        }
        private void FormChat_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (e.CloseReason == CloseReason.UserClosing)
            {
                e.Cancel = true;
                this.Hide();
                tabControl1.TabPages.Clear();
            }
        }
    }
}
https://www.cyberforum.ru/atta... 1304503553
Миниатюры
Окно переписки с вкладками   Окно переписки с вкладками  
0
286 / 231 / 33
Регистрация: 09.02.2011
Сообщений: 435
04.05.2011, 14:26 18
Вот исправленный метод TabPageNew()
C#
1
2
3
4
5
6
7
8
        public void TabPageNew()//Метод добавления вкладок
        {
           
                TabPage tabPage = new TabPage("tab" + Convert.ToString(userId));//заодно свойство Name задаю
            tabPage.Name = "tab" + Convert.ToString(userId);//имя вкладки
            tabControl1.TabPages.Add(tabPage);
            tabControl1.SelectedTab = tabPage;//переводит фокус на новую вкладку
        }
Конструктор типа TabPage(String) Инициализирует новый экземпляр класса TabPage и задает текст для ярлычка вкладки. А ты пытался таким образом присвоить имя.

И userId нужно преобразовывать в тип стринг
1
3 / 3 / 0
Регистрация: 31.03.2011
Сообщений: 34
04.05.2011, 14:32 19
а как теперь этому новому ("tab" + Convert.ToString(userId)) поменять свойство текст?
как то типа этого: ("tab" + Convert.ToString(userId)).Text = "2"
надо как то в коде наверное изменять tabPage
0
286 / 231 / 33
Регистрация: 09.02.2011
Сообщений: 435
04.05.2011, 14:43 20
Так ты сразу задавай свойство Text такое, какое тебе нужно.
Вот здесь ты как раз и задаешь это свойство
C#
1
TabPage tabPage = new TabPage("tab" + Convert.ToString(userId));//заодно свойство Name задаю
Вот посмотри здесь в первом посте 6-й пункт и поймешь так обращаться к уже существующему табпейджу. И внимательно читай, то что я тебе пишу
Ответы на 7 самых частых вопросов по WinForms
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2011, 14:43
Помогаю со студенческими работами здесь

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

Удаление собственной переписки
Привет, хочу сделать удаление переписки. Обработчик такой:...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru