Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/144: Рейтинг темы: голосов - 144, средняя оценка - 4.59
2 / 2 / 0
Регистрация: 17.08.2009
Сообщений: 51
1

Доступ к элементам другой формы

03.09.2009, 15:20. Показов 27183. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
подскажите, как можно осуществить доступ к элементам другой формы.
грубо говоря, мне надо из 2-й формы обновить содержимое листбокса 1й формы.
в первой форме указал в Button с модификатором public
C#
1
2
AddBase second = new AddBase();
second.Show();
вторая форма
C#
1
2
3
4
5
6
7
 public partial class AddBase : Form
    {
        public Admin parentForm;
        public AddBase()
        {
            InitializeComponent(); 
        }
и позже вставляю
C#
1
parentForm.Base_list.Items.Add(Global.name[h]); //Base_list - листбокс первой формы
компилятор выдаёт ошибку
"for_1C.Admin.Base_list" недоступен из-за его уровня защиты. почему он не доступен - не могу понять. и как это исправить? может я совершенно не то делаю?
мне главное понять, как управлять элементами другой формы из текущей формы
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.09.2009, 15:20
Ответы с готовыми решениями:

Доступ к элементам другой формы
Здравствуйте. Подскажите пожалуйста как при закрытии одной формы изменить параметры какого-либо...

Доступ к элементам одной формы из другой
Господа! надо из одной формы менять свойства, например, кнопки, находящейся на другой форме! как в...

Как получить доступ к элементам управления другой формы
как можно получит значение элементов первой формы если в проекте 2 формы Form1 f = new Form1();...

Как получить доступ к элементам формы из другого обычного класса (не из второй формы)
Сабж. В гугле вся инфа только про доступ из другой формы, это я знаю. А вот как получить доступ из...

15
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
03.09.2009, 15:29 2
По умолчанию и по пронцыпам ООП все члены в классе формы являются private, например контролы
можете поставить public, и получите доступ к контролам другой формы, но это не корректно с точки зрения ООП лучше для этой цели использовать public свойства, и через них передавать нужные данные в другую форму.
0
2 / 2 / 0
Регистрация: 17.08.2009
Сообщений: 51
03.09.2009, 15:56  [ТС] 3
Sergei, спасибо за объяснение,не много получилось.
теперь выдаёт ошибку при выполнении на строчку
parentForm.Base_list.Items.Add(Global.name[h]);
пишет, что в экземпляре объекта не задана ссылка на объект.
пытаюсь разобраться... может у кого-нить найдётся совет?
0
14 / 14 / 2
Регистрация: 04.09.2009
Сообщений: 46
04.09.2009, 01:41 4
Желательно, не обращаться напрямую к элементам другой формы, это не безопасно. Лучше это делать через промежуточные функции, проверяя валидность данных. Вот небольшой пример:

Форма №1, к ее элементам мы хотим получить доступ, к примеру к элементу DataGridView:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public object[] AddInfoDataGrid
        {
            set
            {
                for (var i = 0; i < cardGridView.Rows.Count; i++)
                {
                    if (cardGridView.Rows[i].Cells[0].Value.ToString() != value[0].ToString()) continue;
                    cardGridView.Rows[i].Cells[8].Value = value[1];
                    break;
                }
 
                for (var i = 0; i < searchGridView.Rows.Count; i++)
                {
                    if (searchGridView.Rows[i].Cells[0].Value.ToString() != value[0].ToString()) continue;
                    searchGridView.Rows[i].Cells[8].Value = value[1];
                    break;
                }
            }
        }
Форма №2, отсюда мы будем "стучаться":
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private readonly MainForm mainForm;
 
private void saveButton_Click(object sender, EventArgs e)
        {
            if (infoTextBox.Text.CompareTo(oldText) != 0)
            {
                mainForm.AddInfoDataGrid = new object[]
                                               {
                                                   cardNoTextBox.Text,
                                                   infoTextBox.Text
                                               };
            }
        }
0
2 / 2 / 0
Регистрация: 17.08.2009
Сообщений: 51
04.09.2009, 01:45  [ТС] 5
Спасибо, утром попробую реализовать.
0
2 / 2 / 0
Регистрация: 17.08.2009
Сообщений: 51
04.09.2009, 10:18  [ТС] 6
to4kin, что-то я не могу вкурить в ваш код... элемент DataGridView не виден ни в первой, ни во второй форме... да и как-то очень много не понятного для меня в нём... можете не много рассказать или объяснить его?

Цитата Сообщение от to4kin Посмотреть сообщение
Желательно, не обращаться напрямую к элементам другой формы, это не безопасно
почему не безопасно? и к каким последствиям это может привести?
0
14 / 14 / 2
Регистрация: 04.09.2009
Сообщений: 46
04.09.2009, 11:36 7
Цитата Сообщение от pixel_61 Посмотреть сообщение
to4kin, что-то я не могу вкурить в ваш код... элемент DataGridView не виден ни в первой, ни во второй форме... да и как-то очень много не понятного для меня в нём... можете не много рассказать или объяснить его?
Что значит не виден ни в первой, ни во второй? Как минимум DataGridView должен быть виден в той форме, в которой его создали.

C#
1
public object[] AddInfoDataGrid
это функция для работы с DataGridView из вне, в данном случае она позволяет добавлять элемент только в 1 ячейку.
Для наглядности можно описать ее так:

C#
1
2
3
4
5
6
7
public object[] AddInfoDataGrid
        {
            set
            {                
                    DataGridView1.Rows[1].Cells[8].Value = value[0];                   
            }
        }
т.е. мы в строку под номером 1 в ячейку номер 8 записываем что-то.

Далее записываем в DataGridView1 значение из TextBox1
C#
1
2
3
4
mainForm.AddInfoDataGrid = new object[]
                                               {
                                                   TextBox1.Text,
                                               };
Посмотрите внимательнее на названия форм и элементов в вашем проекте, скорее всего проблема в этом.

Цитата Сообщение от pixel_61 Посмотреть сообщение
to4kin, почему не безопасно? и к каким последствиям это может привести?
Если вы откроете доступ к элементу другой формы, следовательно вы откроете доступ ко всем свойствам данного элемента. Через "промежуточную функцию" вы разрешаете изменять в элементе только то что предусмотрено данной функцией и ничего более, элемент же не виден из вне.

P.S. Выложите код двух ваших форм, посмотрим в чем там проблема.

Добавлено через 25 минут
Вот полностью рабочий пример с использованием ListBox'a:

From1:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public partial class Form1 : Form
    {
        private readonly Form2 form2;
 
        public Form1()
        {
            InitializeComponent();
            form2 = new Form2(this);
            form2.Show();
        }
 
        public object[] AddListBox
        {
            set
            {
                listBox1.Items.Add(value[0]);
            }
        }
    }
Form2:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public partial class Form2 : Form
    {
        private readonly Form1 form;
        
        public Form2(Form1 form)
        {
            this.form = form;
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            form.AddListBox = new object[]
                                  {
                                      textBox1.Text
                                  };
        }
    }
0
2 / 2 / 0
Регистрация: 17.08.2009
Сообщений: 51
04.09.2009, 12:24  [ТС] 8
код первой формы
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Security.Cryptography;
 
 
namespace for_1C
{
    public partial class Admin : Form
    {
        public Admin parentForm;
 
        static class Global
        {   // объявляем глабальную переменную
            public static int n=0;
            public static string[] name;
            public static string[] address;
            
 
        } 
 
        public Admin()
        {
 
 
            InitializeComponent();
            
 
            //string PerformText;
            //***************************************************************
            // Блок расшифровки                           *******************
            //***************************************************************
            int lenText;
            
            //rate - 1ый параметр шифрования
            int rate = 1;
            //2ой парам. ширф
            int keyCode = 2;
            string endtext2 = "";
            Encoding encoding = Encoding.GetEncoding("windows-1251");
            StreamReader sr = new StreamReader("C:\\base.list", encoding);
            string line = sr.ReadLine();
            sr.Close();
            lenText = line.Length;
            for (int i = 0; i < lenText; i++)
            {
                int buf = 0;
                buf = (int)(line[i]);
                buf -= (keyCode * rate);
                endtext2 += (char)buf;
 
            }
 
            //****************************************************************
            
            MessageBox.Show(endtext2);
 
            foreach (char a in endtext2)//поиск символа в строке
            {
                if (a == '|')
                {
                    Global.n = Global.n + 1;  //считаем кол-во символов '|'
                }
            }
            //string b = Convert.ToString(Global.n);
            //MessageBox.Show(b);
            
            // блок для считывания символов из декодированной строки в массив до знака | и после
            //**************************************
            
            for (int i = 0; i <= Global.n; i++)
            {
                int k = Global.n / 2;
                //var bases = new List<string>();
                //var paths = new List<string>();
                Global.name = new string[k];
                Global.address = new string[k];
                var arr = endtext2.Split('|');
                int j = i + 1;
                //if (i == j) continue;
                if (j > Global.n) break; 
                if (i % 2 == 0)//проверка на чётность
                {
                    //bases.Add(arr[i]);
                    //Base_list.Items.Add(arr[i]);
                    int h =0;
                    h = h + 1;
                    Global.name[h] = arr[i];
                    this.Base_list.Items.Add(Global.name[h]);
                }
                else
                {
                    //Base_list.Items.Add(arr[i]);
                    //paths.Add(arr[i]);
                    int h = 0;
                    h = h + 1;
                    Global.address[h] = arr[i];
                    //Base_list.Items.Add(Global.address[h]);
                }
                //Base_list.Items.Add(arr[i]);
                //Base_list.Items.Add(arr[j]);
            }
 
 
 
            //for (int i = 0; 1 <= 3; i++)
            //{
            //    Base_list.Items.Add(Global.address[i]);
            //}
            //**************************************                  
 
 
        }
        //запуск формы для редактирования пароля
        public void buttonPasEdit_Click(object sender, EventArgs e)
        {
            pasEdit form = new pasEdit();
            form.Show();
        }
 
 
        public void BaseAdd_Click(object sender, EventArgs e)
        {   //проверка на существование файла
            if (File.Exists(@"c:\bas.list"))
            {
                //AddBase second = new AddBase();
                //second.Show();
                AddBase form = new AddBase(this); 
                form.Show();// запуск формы для добавления базы
 
 
            }
            else
            {
 
                DialogResult result = MessageBox.Show("Файл Base.list не найден. Создать его?", "Файл не найден", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                switch (result)
                {
                    case DialogResult.Yes:
                        {
                            File.Create(@"c:\bas.list");
 
                            if (File.Exists(@"c:\bas.list"))
                            {
                                MessageBox.Show("Файл Base.list успешно создан", "Файл создан", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                            }
                            else
                            {
                                MessageBox.Show("Не удалось создать файл Base.list", "Не удалось создать файл", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            }
                            break;
                        }
                    case DialogResult.No:
                        {
                            return;
                        }
                }
            }
        }
        private void BaseDEL_Click(object sender, EventArgs e)
        {
        }
    }
}
код второй формы

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.IO;
using System.Threading;
 
namespace for_1C
{
    public partial class AddBase : Form
    {
      
 
        static class Global
        {   // объявляем глабальную переменную
            public static int n = 0;
            public static string[] name;
            public static string[] address;
 
 
        } 
        private readonly Admin form;
        
        public AddBase(Admin form)
        {
            this.form = form;
            InitializeComponent();
        }
 
             
 
 
        private void Add_Base_Click(object sender, EventArgs e)
        {
            
 
 
            string nameText;
            string addressText;
            int lenText;            
            //rate - 1ый параметр шифрования
            int rate = 1;
            //2ой парам. ширф
            int keyCode = 2;
            nameText = nameBase.Text+"|";
            addressText = Address_Base.Text+"|";
            string endtext = "";
            string endtext2 = "";
            //шифратор
           
            lenText = nameText.Length;
            for (int i = 0; i < lenText; i++)
            {
                int buf = 0;
                buf = (int)(nameText[i]);
                buf += (keyCode * rate);
                endtext += (char)buf;
 
                
            }
            lenText = addressText.Length;
            for (int i = 0; i < lenText; i++)
            {
                int buf = 0;
                buf = (int)(addressText[i]);
                buf += (keyCode * rate);
                endtext2 += (char)buf;
                                
            }
 
          
 
            Encoding encoding = Encoding.GetEncoding("windows-1251");
            StreamReader sr = new StreamReader(@"C:\base.list",encoding);
            string line = sr.ReadLine();
            sr.Close();
            //MessageBox.Show(line);
            using (StreamWriter wr = new StreamWriter("C:\\base.list", false, encoding))
                wr.WriteLine(line+endtext+endtext2);
            //MessageBox.Show(endtext);
            //MessageBox.Show(nameText);
 
            //******************************************************************
            // Блок расшифровки                           *******************
            //***************************************************************
            int lenText1;
 
            //rate - 1ый параметр шифрования
            //int rate = 1;
            //2ой парам. ширф
            //int keyCode = 2;
            string endtext3 = "";
            //Encoding encoding = Encoding.GetEncoding("windows-1251");
            StreamReader sr1 = new StreamReader("C:\\base.list", encoding);
            string line1 = sr1.ReadLine();
            sr1.Close();
            lenText1 = line1.Length;
            for (int i = 0; i < lenText1; i++)
            {
                int buf = 0;
                buf = (int)(line1[i]);
                buf -= (keyCode * rate);
                endtext3 += (char)buf;
 
            }
 
            //****************************************************************
 
            MessageBox.Show(endtext3);
            foreach (char a in endtext3)//поиск символа в строке
            {
                if (a == '|')
                {
                    Global.n = Global.n + 1;  //считаем кол-во символов '|'
                }
            }
            //string b = Convert.ToString(Global.n);
            //MessageBox.Show(b);
 
            // блок для считывания символов из декодированной строки в массив до знака | и после
            //**************************************
 
            for (int i = 0; i <= Global.n; i++)
            {
                int k = Global.n / 2;
                //var bases = new List<string>();
                //var paths = new List<string>();
                Global.name = new string[k];
                Global.address = new string[k];
                var arr = endtext3.Split('|');
                int j = i + 1;
                //if (i == j) continue;
                if (j > Global.n) break;
                if (i % 2 == 0)//проверка на чётность
                {
                    //bases.Add(arr[i]);
                    //Base_list.Items.Add(arr[i]);
                    int h = 0;
                    h = h + 1;
                    Global.name[h] = arr[i];
                    //MessageBox.Show(Global.name[h]);
                }
                else
                {
                    //Base_list.Items.Add(arr[i]);
                    //paths.Add(arr[i]);
                    int h = 0;
                    h = h + 1;
                    Global.address[h] = arr[i];
                    //form.parentForm.Base_list.Items.Add(Global.address[h]);
                    form.Base_list.Items.Add(Global.name[h]);
                }
 
            }
        }
    }
}
немного переделал по вашему примеру.
0
14 / 14 / 2
Регистрация: 04.09.2009
Сообщений: 46
04.09.2009, 17:25 9
Не совсем понял что делает эта программа, но не в этом суть. Вы опять строите обращение так же как и раньше, не глядя на примеры. Вот переработанный код Вашей программы, обратите внимание на части кода выделенные восклицательными знаками.

Первая форма:
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication
{
    public partial class Form1 : Form
    {
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       public new Form1 ParentForm;//!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
        public Form1()
        {
            InitializeComponent();
 
            //string PerformText;
            //***************************************************************
            // Блок расшифровки                           *******************
            //***************************************************************
 
            //rate - 1ый параметр шифрования
            const int rate = 1;
            //2ой парам. ширф
            const int keyCode = 2;
            var endtext2 = "";
 
            var encoding = Encoding.GetEncoding("windows-1251");
            var sr = new StreamReader("C:\\base.list", encoding);
 
            var line = sr.ReadLine();
            sr.Close();
 
            if (line != null)
            {
                var lenText = line.Length;
                for (var i = 0; i < lenText; i++)
                {
                    var buf = (int) (line[i]);
                    buf -= (keyCode*rate);
                    endtext2 += (char) buf;
                }
 
                //****************************************************************
 
                MessageBox.Show(endtext2);
 
                foreach (var a in endtext2) //поиск символа в строке
                {
                    if (a == '|')
                    {
                        Global.N = Global.N + 1; //считаем кол-во символов '|'
                    }
                }
                //string b = Convert.ToString(Global.N);
                //MessageBox.Show(b);
 
                // блок для считывания символов из декодированной строки в массив до знака | и после
                //**************************************
 
                for (var i = 0; i <= Global.N; i++)
                {
                    var k = Global.N/2;
                    //var bases = new List<string>();
                    //var paths = new List<string>();
                    Global.Name = new string[k];
                    Global.Address = new string[k];
                    var arr = endtext2.Split('|');
                    var j = i + 1;
                    //if (i == j) continue;
                    if (j > Global.N) break;
                    if (i%2 == 0) //проверка на чётность
                    {
                        //bases.Add(arr[i]);
                        //Base_list.Items.Add(arr[i]);
                        var h = 0;
                        h = h + 1;
                        Global.Name[h] = arr[i];
                        Base_list.Items.Add(Global.Name[h]);
                    }
                    else
                    {
                        //Base_list.Items.Add(arr[i]);
                        //paths.Add(arr[i]);
                        var h = 0;
                        h = h + 1;
                        Global.Address[h] = arr[i];
                        //Base_list.Items.Add(Global.Address[h]);
                    }
                    //Base_list.Items.Add(arr[i]);
                    //Base_list.Items.Add(arr[j]);
                }
 
 
 
                //for (int i = 0; 1 <= 3; i++)
                //{
                //    Base_list.Items.Add(Global.Address[i]);
                //}
                //**************************************  
            }
            else
            {
                MessageBox.Show("Файл base.list пустой!");
            }
        }
 
 
 
        static class Global
        {   // объявляем глабальную переменную
            public static int N;
            public static string[] Name;
            public static string[] Address;
        }
 
        //запуск формы для редактирования пароля
        public void buttonPasEdit_Click(object sender, EventArgs e)
        {
            var form = new pasEdit();
            form.Show();
        }
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//Функция для добавления элементов в Base_list
        public object[] AddBaseList
        {
            set
            {
                Base_list.Items.Add(value);
            }
        }
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
        public void BaseAdd_Click(object sender, EventArgs e)
        {
            //проверка на существование файла
            if (File.Exists(@"c:\base.list"))
            {
                //AddBase second = new AddBase();
                //second.Show();
                var form = new AddBase(this);
                form.Show(); // запуск формы для добавления базы
            }
            else
            {
//Взял на себя смелость немного подправить эту часть, уж сильно бросилась в глаза
                if (MessageBox.Show("Файл Base.list не найден. Создать его?", "Файл не найден", 
                    MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1) 
                    == DialogResult.Yes)
                {
                    try
                    {
                        File.Create(@"c:\base.list");
                        MessageBox.Show("Файл Base.list успешно создан", "Файл создан", 
                            MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    }
                    catch (Exception error)
                    {
                        MessageBox.Show("Не удалось создать файл Base.list. Ошибка: " + error, "Не удалось создать файл", 
                            MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }
               
            }
        }
 
    }
}
Вторая форма:
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication
{
    public partial class AddBase : Form
    {
        private readonly Form1 form;
 
        public AddBase(Form1 form)
        {
            this.form = form;
            InitializeComponent();
        }
 
        static class Global
        {   // объявляем глабальную переменную
            public static int N;
            public static string[] Name;
            public static string[] Address;
        }
 
        private void AddBaseClick(object sender, EventArgs e)
        {
            //rate - 1ый параметр шифрования
            const int rate = 1;
            //2ой парам. ширф
            const int keyCode = 2;
            var nameText = nameBase.Text+"|";
            var addressText = Address_Base.Text+"|";
            var endtext = "";
            var endtext2 = "";
            //шифратор
           
            var lenText = nameText.Length;
            for (var i = 0; i < lenText; i++)
            {
                var buf = (int)(nameText[i]);
                buf += (keyCode * rate);
                endtext += (char)buf;
            }
 
            lenText = addressText.Length;
            for (var i = 0; i < lenText; i++)
            {
                var buf = (int)(addressText[i]);
                buf += (keyCode * rate);
                endtext2 += (char)buf;
            }
 
            var encoding = Encoding.GetEncoding("windows-1251");
            var sr = new StreamReader(@"C:\base.list",encoding);
            var line = sr.ReadLine();
            sr.Close();
 
            //MessageBox.Show(line);
            using (var wr = new StreamWriter("C:\\base.list", false, encoding))
                wr.WriteLine(line+endtext+endtext2);
            //MessageBox.Show(endtext);
            //MessageBox.Show(nameText);
 
            //******************************************************************
            // Блок расшифровки                           *******************
            //***************************************************************
 
            //rate - 1ый параметр шифрования
            //int rate = 1;
            //2ой парам. ширф
            //int keyCode = 2;
            var endtext3 = "";
            //Encoding encoding = Encoding.GetEncoding("windows-1251");
            var sr1 = new StreamReader("C:\\base.list", encoding);
            var line1 = sr1.ReadLine();
            sr1.Close();
            var lenText1 = line1.Length;
            for (var i = 0; i < lenText1; i++)
            {
                var buf = (int)(line1[i]);
                buf -= (keyCode * rate);
                endtext3 += (char)buf;
            }
 
            //****************************************************************
 
            MessageBox.Show(endtext3);
            foreach (var a in endtext3)//поиск символа в строке
            {
                if (a == '|')
                {
                    Global.N = Global.N + 1;  //считаем кол-во символов '|'
                }
            }
            //string b = Convert.ToString(Global.N);
            //MessageBox.Show(b);
 
            // блок для считывания символов из декодированной строки в массив до знака | и после
            //**************************************
 
            for (var i = 0; i <= Global.N; i++)
            {
                var k = Global.N / 2;
                //var bases = new List<string>();
                //var paths = new List<string>();
                Global.Name = new string[k];
                Global.Address = new string[k];
                var arr = endtext3.Split('|');
                var j = i + 1;
                //if (i == j) continue;
                if (j > Global.N) break;
                if (i % 2 == 0)//проверка на чётность
                {
                    //bases.Add(arr[i]);
                    //Base_list.Items.Add(arr[i]);
                    var h = 0;
                    h = h + 1;
                    Global.Name[h] = arr[i];
                    //MessageBox.Show(Global.Name[h]);
                }
                else
                {
                    //Base_list.Items.Add(arr[i]);
                    //paths.Add(arr[i]);
                    var h = 0;
                    h = h + 1;
                    Global.Address[h] = arr[i];
                    //form.parentForm.Base_list.Items.Add(Global.Address[h]);
                   //Вот так вызывать, а не напрямую как у вас выше
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//Само добавление в Base_list элемента Global.Name[h]
                   form.AddBaseList = new object[]
                                           {
                                               Global.Name[h]
                                           };
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                }
 
            }
        }
    }
}
И еще такой вопрос. Вот в этом месте
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
for (int i = 0; i <= Global.n; i++)
            {
                int k = Global.n / 2;
                //var bases = new List<string>();
                //var paths = new List<string>();
                Global.name = new string[k];
                Global.address = new string[k];
                var arr = endtext3.Split('|');
                int j = i + 1;
                //if (i == j) continue;
                if (j > Global.n) break;
                if (i % 2 == 0)//проверка на чётность
                {
                    //bases.Add(arr[i]);
                    //Base_list.Items.Add(arr[i]);
                    int h = 0;
                    h = h + 1;
                    Global.name[h] = arr[i];
                    //MessageBox.Show(Global.name[h]);
                }
                else
                {
                    //Base_list.Items.Add(arr[i]);
                    //paths.Add(arr[i]);
                    int h = 0;
                    h = h + 1;
                    Global.address[h] = arr[i];
                    //form.parentForm.Base_list.Items.Add(Global.address[h]);
                    form.Base_list.Items.Add(Global.name[h]);
                }
 
            }
вы обьявляете Global.name, так вот, если проверка на четность не пройдет, и Global.name будет только обьявлен, но не инициализирован, то добавление в Base_list будет выдавать ошибку, т.к. элемент не инициализирован. Возможно тут form.Base_list.Items.Add(Global.name[h]); вы хотели написать Global.adress.
1
2 / 2 / 0
Регистрация: 17.08.2009
Сообщений: 51
07.09.2009, 14:15  [ТС] 10
огромное спасибо!
но не совсем ещё работает
у меня в лист бокс добавляются не элементы массива а надпись "Массив Object[]"

пытался здесь вставить цикл, но это не дало нужного результата
C#
1
2
3
4
5
6
7
8
public object[] AddBaseList
        {
            set
            {
                Base_list.Items.Add(value);
            }
 
        }
не знаю в чём дело...

Цитата Сообщение от to4kin Посмотреть сообщение
вы обьявляете Global.name, так вот, если проверка на четность не пройдет, и Global.name будет только обьявлен, но не инициализирован, то добавление в Base_list будет выдавать ошибку, т.к. элемент не инициализирован. Возможно тут form.Base_list.Items.Add(Global.name[h]); вы хотели написать Global.adress.
я просто в спешке перепутал, я хотел так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (i % 2 == 0)//проверка на чётность
                {
                    //bases.Add(arr[i]);
                    //Base_list.Items.Add(arr[i]);
                    int h = 0;
                    h = h + 1;
                    Global.name[h] = arr[i];
                     form.Base_list.Items.Add(Global.name[h]);
                }
                else
                {
                    //Base_list.Items.Add(arr[i]);
                    //paths.Add(arr[i]);
                    int h = 0;
                    h = h + 1;
                    Global.address[h] = arr[i];
                    //form.parentForm.Base_list.Items.Add(Global.address[h]);
                   
                }
0
14 / 14 / 2
Регистрация: 04.09.2009
Сообщений: 46
07.09.2009, 15:35 11
Проверьте правильность написания вызова функции для добавления элементов из второй формы:

C#
1
2
3
4
form.AddBaseList = new object[]
                                           {
                                               Global.Name[h]
                                           };
0
2 / 2 / 0
Регистрация: 17.08.2009
Сообщений: 51
07.09.2009, 16:03  [ТС] 12
именно так и написано у меня
C#
1
2
3
4
form1.AddBaseList = new object[]
                                           {
                                               Global.name[h]
                                           };
я пробовал месседжбокс вставлять перед этим, он мне все элементы правильно отображал.
0
14 / 14 / 2
Регистрация: 04.09.2009
Сообщений: 46
07.09.2009, 18:24 13
Просмотрел код еще раз, ошибка в том что Global.name[h] = NULL, т.е. элемент пуст, проверь свой код, где вносишь данные в этот массив, либо сделай так:

C#
1
2
3
4
5
if (Global.Name[h] != null)
 form1.AddBaseList = new object[]
                                           {
                                               Global.name[h]
                                           };
Тогда пустые эелементы не будут добавляться. И второе, добавление делается по другому:

C#
1
2
3
4
5
6
7
public object[] AddBaseList
        {
            set
            {
                Base_list.Items.Add(String.Format("{0}",value));
            }
        }
1
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
08.09.2009, 05:05 14
Цитата Сообщение от pixel_61 Посмотреть сообщение
у меня в лист бокс добавляются не элементы массива а надпись "Массив Object[]"
пытался здесь вставить цикл, но это не дало нужного результата
C#
1
2
3
4
5
6
7
8
9
public object[] AddBaseList
        {
            set
            {
                foreach(object obj in value)
                    Base_list.Items.Add(obj);
            }
 
        }


Цитата Сообщение от to4kin Посмотреть сообщение
И второе, добавление делается по другому:
Код C#
public object[] AddBaseList
{
set
{
Base_list.Items.Add(String.Format("{0}",value));
}
}
То же самое, что и у автора. Для отображения объектов, в листбоксе используется метод ToString к каждому элементу списка. Формат даст тоже самое
0
14 / 14 / 2
Регистрация: 04.09.2009
Сообщений: 46
08.09.2009, 10:44 15
Цитата Сообщение от Green Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
public object[] AddBaseList
        {
            set
            {
                foreach(object obj in value)
                    Base_list.Items.Add(obj);
            }
 
        }



То же самое, что и у автора. Для отображения объектов, в листбоксе используется метод ToString к каждому элементу списка. Формат даст тоже самое
Специально занес в проект, формат дает другой результат.
0
2 / 2 / 0
Регистрация: 17.08.2009
Сообщений: 51
09.09.2009, 09:51  [ТС] 16
Цитата Сообщение от to4kin Посмотреть сообщение
Просмотрел код еще раз, ошибка в том что Global.name[h] = NULL, т.е. элемент пуст, проверь свой код, где вносишь данные в этот массив, либо сделай так:

C#
1
2
3
4
5
if (Global.Name[h] != null)
 form1.AddBaseList = new object[]
                                           {
                                               Global.name[h]
                                           };
Тогда пустые эелементы не будут добавляться. И второе, добавление делается по другому:

C#
1
2
3
4
5
6
7
public object[] AddBaseList
        {
            set
            {
                Base_list.Items.Add(String.Format("{0}",value));
            }
        }
Спасибо огромное! Так всё работает
теперь буду отлаживать свои циклы и условия(не совсем корректно работает прога). с этим сам справлюсь =)
0
09.09.2009, 09:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2009, 09:51
Помогаю со студенческими работами здесь

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

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

Доступ к элементам формы
Привет всем! Народ, такой вопрос. Можно ли организовать доступ к элементам формы через индексы? ...

Публичный доступ к элементам формы
подскажите пожалуйста просто способ, как сделать элементы на форме доступными в классе...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru