Вопрос по C# [Update]
В Visual Studio добавляешь новую форму: Правый клик по solution → Add → Windows Form…, в обработчик нужного события (для кнопки в него можно попасть по двойному щелчку, например) добавляешь:
var form = new MyForm;
MyForm.ShowDialog;
или какие-то другие действия, в зависимости от того, что стоит делать.
А если я просто вырезала этот кусок из старого работавшего кода, где все классы были в одном пространстве имен, в одном файле, почему может перестать работать? Чего я не заметила? Чего могла вырезать лишнего?
Что значит «перестало работать»? Нажми Ctrl+W+E, скопируй ошибку.
Просто не работает F5 и не активна та зелёная стрелочка вправо.
Приведённого тобой в первом посте кода недостаточно для запуска приложения. Например, у тебя не определён метод InitializeComponent; в классе Form_Test.
У вас нет штатного специалиста, который занимается допиливанием приложений или более опытного, который может подсказать тебе на месте, что делать?
Но ведь скопированная программа работала, пока я не выкинула кусок (не пойму, какой). В исходном коде полный список подключённых классов таков:
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;
Которого не хватает для определения метода?
Попробуй добавить все указанные пространства имён и выполнить Build, но не думаю, что это поможет.
Также ты пробовала что-то выводить на консоль. Этого делать не надо, т.к. у тебя оконное приложение и консоли у тебя нет. Попробуй использовать MessageBox.Show.
А консоль была тогда, когда я училась запускать программу совсем без форм. Уберу.
Если маленькая, то выложи сюда всю программу (весь каталог, где лежит .csproj файл).
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.
DATE_pom = Convert.ToDateTime(dateTimePicker_START.Value.Date);
DATE_pom = Convert.ToDateTime(dateTimePicker_END.Value.Date);
Каждая из этих строк означает: записать в переменную DATE_pom значение даты, взятое из Control-а по имени dateTimePicker_START (соответственно, END). Эти Control-ы должны присутствовать на твоей форме и называться именно так (смотри в дизайнере формы).
cmd.Parameters.Add("@START", SqlDbType.DateTime).Value = DateVar("START"); (я так понимаю, здесь мы просто передаем в процедуру на сервере требуемые параметры)
или
Date_pom = DateVar("END"); (а здесь просто присваиваем переменной значение, которое ползовател задаст в соответствующем окошке)
Это что-то делающееся исключительно графически и никогда не попадающее в код? (Тогда какие ещё могут быть сюрпризы?...)
Почитай FormName.designer.cs
Спасибо огромное! Буду разбираться дальше.
Ребята, спасибо за помощь, кнопочку выбора в проект дописала!
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.?
почти. еще где-то есть строка вида Funds = new Button;, и строка вида zzz.Add(Funds)
> типа private void с параметрами object sender и несколькими EventArgs, например
EventArgs может быть один и только один
> Насколько я понимаю, в самой Funds_Click просто стоит “защита от дурака“, подключение к базе данных и вызов процедуры (в которой, собственно, и выполняется запрос к базе)?
да
> Немного непонятно ещё, почему нельзя писать внутри класса без this.?
можно, но этот код генерится автоматически, и для уменьшения каких-либо коллизий добавляется this.
Позвольте ещё один немножко наивный вопрос. Конструктор формы состоит из одной-единственной строки: InitializeComponent ;. Процедура InitializeComponent ; прописана вне самого класса, который определяет форму. Это сделано, может быть, лишь для удобства - чтобы не писать весь огромный конструктор, задающий море кнопочек, в том же самом файле, в котором мы пропишем уже только то, какие кнопки как работают и какие процедуры вызывают? Или есть и иные доводы?
Позвольте ещё один немножко наивный вопрос. Конструктор формы состоит из одной-единственной строки: InitializeComponent ;. Процедура InitializeComponent ; прописана вне самого класса, который определяет форму. Это сделано, может быть, лишь для удобства - чтобы не писать весь огромный конструктор, задающий море кнопочек, в том же самом файле, в котором мы пропишем уже только то, какие кнопки как работают и какие процедуры вызывают? Или есть и иные доводы?Да, именно так, чтобы сгенерированный код не отвлекал от твоей логики.
Как отключить звук при нажатии на кнопку? При тестировании немного нервирует, когда "защита от дурака" начинается. Она выскакивает в виде типичного окошечка Y/N или OK, с дурацким коротким "бульканьем".
Сделать свой диалог если только, либо отключить такие звуки в Windows.
DialogResult result1 = MessageBox.Show("Question?",
"Important Question",
MessageBoxButtons.YesNo);
if (result1 == DialogResult.Yes)
{
// Code...
}
Или это за своё не считается?
MessageBoxЭто не своё. Своё будет, если ты создашь форму MyYesNoDialog и вместо MessageBox выше будет стоять YesNoDialog.
В дизайнере формы сделана кнопка:
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");
}
Что за ошибка?
Invalid token '(' in class, struct or interface member declaration.
Напиши этот вызов в каком-нибудь методе, а не в теле класса.
Там получается то же самое. Пишу в другом классе теперь, но ошибка та же.
не мешало бы увидеть код
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");
}
Немного не понимаю... Я где-то сделала глупую ошибку?...
— декларация члена класса
сombobox1.Items.Add("ConstantText");
— вызов метода
понимаешь разницу?
Да, теперь понимаю, что это разные вещи. Но разве после декларации нельзя сделать инициализацию объявленного объекта, дав ему некоторое значение? Делала это также и в конструкторе, а потом и в другой процедуре...
private int x = 5; // значением может быть только константа
тогда как вызов
сombobox1.Items.Add("ConstantText");
— уже не задание начального значения, а вызов метода.
Оставить комментарий
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;
}
}
}
}