Вопрос по C# [Update]

maximovega

   Признаюсь, с C# столкнулась недавно и единственное, что нужно сделать - добавить окошко в чужую форму. В структуре программы, основных особенностях языка разобралась (пока не идеально, конечно).
   До меня было написано окошко выбора даты. Самостоятельно пытаюсь понять, как оно работало, вывести на консоль даты, чтобы понять, какой кусок кода за создание чего отвечает. (Пока написала хоть какой вывод на консоль для тестирования, работает ли структура вообше.)
Ранее при запуске ниже написанного запускалось целиком диалоговое окно, написанное до меня. Не могу понять, почему. Теперь изменила название наследованного класса и закрыла вдобавок старую программу.
   Почему может перестать работать F5 (компиляция, запуск)?
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
namespace Auxiliary
{
    class Program
    {
     static void Main(string[] args)
     {
     Application.EnableVisualStyles;
     Application.SetCompatibleTextRenderingDefault(false);
     Application.Run(new Form_Test;
     }
     public partial class Form_Test : Form
     {
     public Form_Test
     { InitializeComponent; }
     public DateTime DateVar(string var)
     {
     DateTime DATE_pom;
     switch (var)
     {
     case "START":
     DATE_pom = Convert.ToDateTime(dateTimePicker_START.Value.Date);
     break;
     case "END":
     DATE_pom = Convert.ToDateTime(dateTimePicker_END.Value.Date);
     break;
     default:
     DATE_pom = new DateTime(2100, 01, 01, 0, 0, 0);
     break;
     }
     return DATE_pom;
     }
     public void P_Test
     {
     DateTime Start, End;
     Start = DateVar("START");
     End = DateVar("END");
     }
     private void Test_Click(object sender, EventArgs e)
     {
     P_Test;
     string Name = "Name"; Console.WriteLine("{0}", Name); Console.ReadLine;
     }
     }
    }
}

okis

Оформи код в тег code. Каждый отдельный класс оформляй в отдельный файл.
В Visual Studio добавляешь новую форму: Правый клик по solution → Add → Windows Form…, в обработчик нужного события (для кнопки в него можно попасть по двойному щелчку, например) добавляешь:

var form = new MyForm;
MyForm.ShowDialog;

или какие-то другие действия, в зависимости от того, что стоит делать.

maximovega

А если я просто вырезала этот кусок из старого работавшего кода, где все классы были в одном пространстве имен, в одном файле, почему может перестать работать? Чего я не заметила? Чего могла вырезать лишнего?

okis

Что значит «перестало работать»? Нажми Ctrl+W+E, скопируй ошибку.

maximovega

Ошибок и сообщений ноль...
Просто не работает F5 и не активна та зелёная стрелочка вправо.

okis

Для того, чтобы создать новое приложение в Visual Studio, необходимо сделать File → New Project, там выбрать Windows Forms Application (ведь оно тебе надо будет создана форма. Далее необходимо добавить твой код в решение и попробовать его собрать. Если ты просто создаёшь файл .cs, ничего не заработает.
Приведённого тобой в первом посте кода недостаточно для запуска приложения. Например, у тебя не определён метод InitializeComponent; в классе Form_Test.
У вас нет штатного специалиста, который занимается допиливанием приложений или более опытного, который может подсказать тебе на месте, что делать?

maximovega

   Нету. Точнее, есть кому подсказать, но как раз ему надо сдать это, когда он вернется из отпуска. Если отдел не сдаст проект (или не сдаст вовремя будет не совсем хорошо...
   Но ведь скопированная программа работала, пока я не выкинула кусок (не пойму, какой). В исходном коде полный список подключённых классов таков:
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.Data.SqlClient;
using System.Collections;
using System.Data.OleDb;
using System.Data.Common;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
using System.Diagnostics;
   Которого не хватает для определения метода?

okis

Ты пробовала делать то, что я предложил? Можешь сделать скриншот студии с открытым проектом, где видны окна Build Log, Solution Explorer?
Попробуй добавить все указанные пространства имён и выполнить Build, но не думаю, что это поможет.
Также ты пробовала что-то выводить на консоль. Этого делать не надо, т.к. у тебя оконное приложение и консоли у тебя нет. Попробуй использовать MessageBox.Show.

maximovega

   Уже пытаюсь. Просто впервые с этим работаю. Понять, что программа делала до меня, чуть проще, чем с нуля учиться делать отдельные куски. :)
А консоль была тогда, когда я училась запускать программу совсем без форм. Уберу.

zorin29

У тебя осталась старая, работающая, версия программы? Программа большая?
Если маленькая, то выложи сюда всю программу (весь каталог, где лежит .csproj файл).

maximovega

Я так поняла из исходного кода, что запуск одной функции управляется следующими шагами:
1. Выбор параметров (даты)
2. Код самой процедуры
3. Запуск процедуры кнопкой
Выбор параметров осуществляется с помощью DateVar (как только выбор предоставляется такими сложными окошками благодаря такой короткой процедуре, не поняла пока) в процедуре P_Test (диалоговое окно после запуска исходного кода содержит окошки START, END которую вызывает процедура по нажатии кнопки P_Test_Click.
На данный момент создала новый проект. Файл Form1.cs содержит
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;
namespace Auxiliary
{
public partial class Form_Test : Form
{
public Form_Test
{ InitializeComponent; }
public DateTime DateVar(string var)
{
DateTime DATE_pom;
switch (var)
{
case "START":
DATE_pom = Convert.ToDateTime(dateTimePicker_START.Value.Date);
break;
case "END":
DATE_pom = Convert.ToDateTime(dateTimePicker_END.Value.Date);
break;
default:
DATE_pom = new DateTime(2100, 01, 01, 0, 0, 0);
break;
}
return DATE_pom;
}
public void P_Test
{
DateTime Start, End;
Start = DateVar("START");
End = DateVar("END");
}
private void Test_Click(object sender, EventArgs e)
{
P_Test;
}
}
}
Program.cs -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Auxiliary
{
static class Program
{
[STAThread]
static void Main
{
Application.EnableVisualStyles;
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form_Test;
}
}
}
Попытка запуска дает
no suitable method found to override.

zorin29


DATE_pom = Convert.ToDateTime(dateTimePicker_START.Value.Date);
DATE_pom = Convert.ToDateTime(dateTimePicker_END.Value.Date);

Каждая из этих строк означает: записать в переменную DATE_pom значение даты, взятое из Control-а по имени dateTimePicker_START (соответственно, END). Эти Control-ы должны присутствовать на твоей форме и называться именно так (смотри в дизайнере формы).

maximovega

Не могу никак понять, как код делает эти Control-ы, какой кусок ответственен за это... Прошла всю программу, START и END написаны только в DateVar и использующих её функциях, например:
cmd.Parameters.Add("@START", SqlDbType.DateTime).Value = DateVar("START"); (я так понимаю, здесь мы просто передаем в процедуру на сервере требуемые параметры)
или
Date_pom = DateVar("END"); (а здесь просто присваиваем переменной значение, которое ползовател задаст в соответствующем окошке)
Это что-то делающееся исключительно графически и никогда не попадающее в код? (Тогда какие ещё могут быть сюрпризы?...)

zorin29

Почитай FormName.designer.cs

maximovega

Вот теперь можно ахнуть... :shocked: :(
Спасибо огромное! Буду разбираться дальше. :)

maximovega

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

maximovega

Понимаю ли верно, что работа кнопки диалогового окна, фактически, заключается в описании вида
this.Funds.BackColor = System.Drawing.Color.MistyRose;
this.Funds.Font = new System.Drawing.Font("Rage Italic", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, byte0;
this.Funds.ForeColor = System.Drawing.SystemColors.ControlLightLight;
this.Funds.Location = new System.Drawing.Point(60, 185);
this.Funds.Name = " Funds ";
this.Funds.Size = new System.Drawing.Size(144, 23);
this.Funds.Text = " Funds ";
this.Funds.UseVisualStyleBackColor = false;
this.Funds.Click += new System.EventHandler(this. Funds _Click);
которое находится внутри некоторого класса?
Все строки описывают кнопку, а последняя обеспечивает то, что при её нажатии программа находит описанную функцию (в нашем случае это Funds _Click) и запускает ее?
А передать в EventHandler можно лишь функцию типа private void с параметрами object sender и несколькими EventArgs, например
private void Funds_Click(object sender, EventArgs e)
{
DialogResult result1 = MessageBox.Show("Question?",
"Important Question",
MessageBoxButtons.YesNo);
if (result1 == DialogResult.Yes)
{
conn = new SqlConnection(GlobalVar.ConnectionSQL_01);
conn.Open;
textBox_SITUATION.Text = "Creating Funds…"; textBox_SITUATION.Refresh;
P_Funds;
conn.Close;
}
textBox_SITUATION.Text = "Finished...";
}?
Насколько я понимаю, в самой Funds_Click просто стоит “защита от дурака“, подключение к базе данных и вызов процедуры (в которой, собственно, и выполняется запрос к базе)?
Немного непонятно ещё, почему нельзя писать внутри класса без this.? :o

Dasar

> окна, фактически, заключается в описании вида
почти. еще где-то есть строка вида Funds = new Button;, и строка вида zzz.Add(Funds)
> типа private void с параметрами object sender и несколькими EventArgs, например
EventArgs может быть один и только один
> Насколько я понимаю, в самой Funds_Click просто стоит “защита от дурака“, подключение к базе данных и вызов процедуры (в которой, собственно, и выполняется запрос к базе)?
да
> Немного непонятно ещё, почему нельзя писать внутри класса без this.? :o
можно, но этот код генерится автоматически, и для уменьшения каких-либо коллизий добавляется this.

maximovega

Позвольте ещё один немножко наивный вопрос. :o Конструктор формы состоит из одной-единственной строки: InitializeComponent ;. Процедура InitializeComponent ; прописана вне самого класса, который определяет форму. Это сделано, может быть, лишь для удобства - чтобы не писать весь огромный конструктор, задающий море кнопочек, в том же самом файле, в котором мы пропишем уже только то, какие кнопки как работают и какие процедуры вызывают? Или есть и иные доводы?

okis

Позвольте ещё один немножко наивный вопрос. Конструктор формы состоит из одной-единственной строки: InitializeComponent ;. Процедура InitializeComponent ; прописана вне самого класса, который определяет форму. Это сделано, может быть, лишь для удобства - чтобы не писать весь огромный конструктор, задающий море кнопочек, в том же самом файле, в котором мы пропишем уже только то, какие кнопки как работают и какие процедуры вызывают? Или есть и иные доводы?
Да, именно так, чтобы сгенерированный код не отвлекал от твоей логики.

maximovega

Как отключить звук при нажатии на кнопку? :o При тестировании немного нервирует, когда "защита от дурака" начинается. :) Она выскакивает в виде типичного окошечка Y/N или OK, с дурацким коротким "бульканьем". :(

okis

Сделать свой диалог если только, либо отключить такие звуки в Windows.

maximovega

Так диалоговое окошко своё. :D Как это тогда прописать?
DialogResult result1 = MessageBox.Show("Question?",
"Important Question",
MessageBoxButtons.YesNo);
if (result1 == DialogResult.Yes)
{
// Code...
}
Или это за своё не считается? :crazy: :(

okis

MessageBox
Это не своё. Своё будет, если ты создашь форму MyYesNoDialog и вместо MessageBox выше будет стоять YesNoDialog.

maximovega

Почему не получается добавить элементы в список?
В дизайнере формы сделана кнопка:
class Form_Test
{
private void TestClassConstructor
{
this.comboBox1 = new System.Windows.Forms.ComboBox;
this.comboBox1.FormattingEnabled = true;
this.comboBox1.Location = new System.Drawing.Point(84, 74);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(39, 21);
this.comboBox1.DropDownStyle = comboBoxStyle.DropDownList;
this.comboBox1.TabIndex = 84;
this.Controls.Add(this.comboBox1);
}
private System.Windows.Forms.ComboBox comboBox1;
// и здесь выскакивает ошибка
combobox1.Items.Add("ConstantText");
}

okis

Что за ошибка?

maximovega

Invalid token '(' in class, struct or interface member declaration.

okis

Вполне обоснованно, в этом месте нельзя писать инструкции, только декларации.
Напиши этот вызов в каком-нибудь методе, а не в теле класса.

maximovega

   Там получается то же самое. Пишу в другом классе теперь, но ошибка та же.

margadon

не мешало бы увидеть код

sergeikozyr

почитай плз :)

class Form_Test
{
private void TestClassConstructor
{
this.comboBox1 = new System.Windows.Forms.ComboBox;
this.comboBox1.FormattingEnabled = true;
this.comboBox1.Location = new System.Drawing.Point(84, 74);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(39, 21);
this.comboBox1.DropDownStyle = comboBoxStyle.DropDownList;
this.comboBox1.TabIndex = 84;

this.Controls.Add(this.comboBox1);
}
private System.Windows.Forms.ComboBox comboBox1;

// и здесь выскакивает ошибка

combobox1.Items.Add("ConstantText");
}

maximovega

Немного не понимаю... :( Я где-то сделала глупую ошибку?...

okis

private System.Windows.Forms.ComboBox comboBox1;
 — декларация члена класса
сombobox1.Items.Add("ConstantText");
 — вызов метода
понимаешь разницу?

maximovega

Да, теперь понимаю, что это разные вещи. :) Но разве после декларации нельзя сделать инициализацию объявленного объекта, дав ему некоторое значение? Делала это также и в конструкторе, а потом и в другой процедуре...

okis

Да, но тогда это тоже необходимо делать в декларации. Например:
private int x = 5; // значением может быть только константа
тогда как вызов
сombobox1.Items.Add("ConstantText");
 — уже не задание начального значения, а вызов метода.
Оставить комментарий
Имя или ник:
Комментарий: