Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 07.05.2011
Сообщений: 9
1

Запутался с классами, методами, событиями

13.05.2011, 13:28. Показов 788. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, С# изучаю недавно и нужна помощь, не до конца понимаю классы и работу с ними. Ситуация такая: мне нужно создать datatable и изменять его наполнение, нажимая различные кнопки на форме. На данный момент пока написал только такой код:
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
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 Excel = Microsoft.Office.Interop.Excel;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Excel.Application excelapp;
        private Excel.Window excelWindow;
        private Excel.Workbooks excelappworkbooks;
        private Excel.Workbook excelappworkbook;
        private Excel.Sheets excelsheets;
        private Excel.Worksheet excelworksheet;
        private Excel.Range excelcells;
        private Excel.Range new_var;
        private Excel.Range new_var1;
        private Excel.Range gender1;
        public System.Data.DataTable p_table;
 
//begin--------------------------------------- Определение метода, вычисляющего возраст человека ---------------------------------------
        public static int CalculateAge(DateTime BirthDate)
        {
            int YearsPassed = DateTime.Now.Year - BirthDate.Year;
            if (DateTime.Now.Month < BirthDate.Month || (DateTime.Now.Month == BirthDate.Month && DateTime.Now.Day < BirthDate.Day))
            {
                YearsPassed--;
            }
            return YearsPassed;
        }
//end-----------------------------------------------------------------------------------------------------------------------------------
 
 
//begin--------------------------------------- Определение метода, вычисляющего стаж человека 
 
        public static int CalculateStag(DateTime dt1, DateTime dt2)
        {
            int stag = dt1.Year - dt2.Year;
            if (dt1.Month < dt2.Month || (dt1.Month == dt2.Month && dt1.Day < dt2.Day))
            {
                stag--;
            }
            return stag;
        }
//end-----------------------------------------------------------------------------------------------------------------------------------
 
 
//begin------------------------ Определение метода, создающего datatable 
 
        public static DataTable make_table(DataTable table) 
        {
            DataColumn column;
            
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.Int32");
            column.ColumnName = "№";
            column.AutoIncrement = true;
            column.ReadOnly = true;
            column.Unique = true;
            table.Columns.Add(column);
 
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Ф.И.О";
            column.AutoIncrement = false;
            column.ReadOnly = true;
            column.Unique = false;
            table.Columns.Add(column);
 
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Дата рождения";
            column.AutoIncrement = false;
            column.ReadOnly = true;
            column.Unique = false;
            table.Columns.Add(column);
 
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Дата устройства на работу";
            column.AutoIncrement = false;
            column.ReadOnly = true;
            column.Unique = false;
            table.Columns.Add(column);
 
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Пол";
            column.AutoIncrement = false;
            column.ReadOnly = true;
            column.Unique = false;
            table.Columns.Add(column);
 
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.Int32");
            column.ColumnName = "Оклад";
            column.AutoIncrement = false;
            column.ReadOnly = true;
            column.Unique = false;
            table.Columns.Add(column);
 
            DataColumn[] PrimaryKeyColumns = new DataColumn[1];
            PrimaryKeyColumns[0] = table.Columns["id"];
            table.PrimaryKey = PrimaryKeyColumns;
 
            return table;
        }
//end-----------------------------------------------------------------------------------------------------------------------------------
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            excelapp = new Excel.Application();
            excelapp.Workbooks.Open(@"C:\file.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing);
            excelappworkbooks = excelapp.Workbooks;
            excelappworkbook = excelappworkbooks["file.xlsx"];
            //excelapp.Visible = true;
            listBox1.Items.Add("Документ успешно открыт");
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            excelappworkbooks = excelapp.Workbooks;
            excelappworkbook = excelappworkbooks["file.xlsx"];
 
            try
            {
                excelappworkbook.SaveAs(@"C:\new_file.xlsx", Excel.XlFileFormat.xlOpenXMLWorkbook,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            }
            catch (Exception ex)
            {
                listBox1.Items.Add(ex.Message);
            }
 
        }
 
        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            listBox1.Items.Add(dateTimePicker1.Value);
        }
        
      
        private void button2_Click(object sender, EventArgs e)
        {
            excelapp.Workbooks.Close();
            excelapp.Quit();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
                    
        }
        private void button4_Click(object sender, EventArgs e)
        {
            System.Data.DataTable p_table = new DataTable("ParentTable");
            System.Data.DataTable table_collection1 = new DataTable("ParentTable");
            make_table(p_table);
            make_table(table_collection1);
            DataRow row;
 
 
            int i;
            i = 1;
            excelsheets = excelappworkbook.Worksheets;
            excelworksheet = (Excel.Worksheet)excelsheets.get_Item("Лист1");
            excelcells = excelworksheet.get_Range("A" + i, "A" + i);
 
            while (Convert.ToString(excelcells.Value2) != "")
            {
 
                new_var = excelworksheet.get_Range("B" + i, "B" + i);
                new_var1 = excelworksheet.get_Range("C" + i, "C" + i);
                gender1 = excelworksheet.get_Range("D" + i, "D" + i);
                var dt = DateTime.FromOADate(Convert.ToDouble(new_var.Value2));
                var dt1 = DateTime.FromOADate(Convert.ToDouble(new_var1.Value2));
                row = p_table.NewRow();
                row["№"] = i;
                row["Ф.И.О"] = Convert.ToString(excelcells.Value2);
                row["Дата рождения"] = dt;
                row["Дата устройства на работу"] = dt1;
                row["Пол"] = Convert.ToString(gender1.Value2);
                p_table.Rows.Add(row);
                i = i + 1;
 
 
                excelcells = excelworksheet.get_Range("A" + i, "A" + i);
            };
 
            table_collection1.Columns["Оклад"].ColumnName = "Возраст";
            int j;
            j = 1;
            for (i = 1; i < p_table.Rows.Count; i++)
            {
                row = table_collection1.NewRow();
                row["№"] = j;
                row["Ф.И.О"] = p_table.Rows[i]["Ф.И.О"];
                row["Дата рождения"] = p_table.Rows[i]["Дата рождения"];
                row["Дата устройства на работу"] = p_table.Rows[i]["Дата устройства на работу"];
                row["Пол"] = p_table.Rows[i]["Пол"];
                row["Возраст"] = CalculateAge(Convert.ToDateTime(p_table.Rows[i]["Дата рождения"]));
                table_collection1.Rows.Add(row);
                j = j + 1;
            }
 
            dataGridView1.DataSource = p_table;
            dataGridView2.DataSource = table_collection1;
        } 
 
        private void button5_Click(object sender, EventArgs e)
        {
              table_collection1.Columns["Оклад"].ColumnName = "Тест";
        }
}
При компиляции выдает такую ошибку: The name 'table_collection1' does not exist in the current context в событии button_Click5. Как я понял, таблица 'table_collection1' существует только внутри метода клик для кнопки Button 4. Соответственно вопрос: Как обратиться к 'table_collection1' из другой кнопки? Или же как создать датаtable вне метода, и обращаться к нему по различным событиям от различных элементов управления? Заранее, спасибо. P.S. Все (обращение к excel, считывание и заполнение datable) в привиденном коде работает
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2011, 13:28
Ответы с готовыми решениями:

файл с классами и методами
Добрый вечер, недавно начал учить c# и решил понемногу кодить небольшие приложения для...

Работа с классами и методами
Доброго времени суток. У меня вот в чем вопрос. Есть 2 класса, Program и MyArray Часть кода...

Перемещении между классами и методами
У меня есть 2 класса и 2 метода. Мне нужно, чтобы из одного он мог перейти в другой. Вот куски...

Работа с generic классами и методами
Добрый день! Встал в ступор, надеюсь поможет кто разобраться. Имею следующую задачу: на основе...

4
гроза ленивых студентов
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
13.05.2011, 13:35 2
объявление System.Data.DataTable table_collection1 вынеси за пределы методов...чтоб она у тебя стала полем класса формы...
0
0 / 0 / 0
Регистрация: 07.05.2011
Сообщений: 9
13.05.2011, 13:59  [ТС] 3
Строку System.Data.DataTable table_collection1 = new DataTable("ParentTable"); вынес за пределы метода. Получилось так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Excel.Application excelapp;
        private Excel.Window excelWindow;
        private Excel.Workbooks excelappworkbooks;
        private Excel.Workbook excelappworkbook;
        private Excel.Sheets excelsheets;
        private Excel.Worksheet excelworksheet;
        private Excel.Range excelcells;
        private Excel.Range new_var;
        private Excel.Range new_var1;
        private Excel.Range gender1;
        System.Data.DataTable table_collection1 = new DataTable("ParentTable");
При выполнении программы при выполнии события кнопки 5 выдается ошибка:
Object reference not set to an instance of an object.

Добавлено через 1 минуту
При этом событие по кнопке 4 выполнилось успешно.
0
гроза ленивых студентов
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
13.05.2011, 14:33 4
чудеса...мои варианты:
1) объявление ты вынес за пределы методов, но в событие кнопки 4 оставил строку без изменений вот так:
C#
1
System.Data.DataTable table_collection1 = new DataTable("ParentTable");
если да - убери тип данных, сделай просто:
C#
1
table_collection1 = new DataTable("ParentTable");
2) ты точно нажал сначала кнопку 4, а потом кнопку 5?
3) если с первыми двумя пунктами я неправ - выкладывай проект
1
0 / 0 / 0
Регистрация: 07.05.2011
Сообщений: 9
14.05.2011, 16:43  [ТС] 5
Заново набрал строку table_collection1.Columns["Оклад"].ColumnName = "Тест";
Все заработало, спасибо.
0
14.05.2011, 16:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2011, 16:43
Помогаю со студенческими работами здесь

Обмен событиями между классами
как с помощью dispatchevent послать событие из одного класса другому(адресату) весь нет перерыл...

Работа с классами и методами
Привет, кто подскажет правильно ли передаю координаты вектора для получения его длины? (файлы...

Работа с классами и их методами.
Есть класс numerals, состоящий из двух дробных чисел. Среди методов - сложение, вычитание, деление...

Работа с методами и классами
Доброго времени суток, почему-то не работает код: (чтобы было понятнее, то вот задание) Создать...


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

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