#c# #winforms #visual-studio
#c# #winforms #visual-studio
Вопрос:
Я борюсь между Show и ShowDialog методом отображения / отображения Windows Forms. Я обычно использую метод show вместо ShowDialog
метода. И этот ShowDialog
метод используется, когда я не хочу показывать формы в окне инструментов ALT TAB.
ShowDialog
Метод показывает форму окна модели, доступ к которой ограничен по сравнению с обычной формой окна. Форма окна модели не обращается к значению элемента управления и объекта, которые уже переданы в обычной форме окна. Следовательно, мы должны предоставлять новое значение каждый раз или каждый раз для нового экземпляра forms, который является реальным примером, как показано ниже.
//Purchase_Entry having a public method which is calling from form30 as under:
public partial class purchase_Entry : Form
{
public purchase_Entry()
{
InitializeComponent();
}
public void Purchase_Binding()
{
mydgv.Location = new Point(0, 110);
mydgv.RowHeadersVisible = false;
mydgv.Width = panel2.Width;
mydgv.Height = panel2.Height - 220;
mydgv.TabIndex = 4;
string connstr = "server=.;initial catalog=maa;uid=mah;pwd=mah";
SqlConnection con = new SqlConnection(connstr);
con.Open();
string sql = @"select billno,date=convert(varchar,date,103),ledgeraccount,totcts,rround,grosspurchase,taxes,taxamt,totdb,narrat"
" from depurchasea where companyID=@companyID"
" and transID=@transID"
" group by billno,date,ledgeraccount,totcts,rround,grosspurchase,taxes,taxamt,totdb,narrat"
" order by date,billno";
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.AddWithValue("companyID", label6.Text);
cmd.Parameters.AddWithValue("transID", textBox5.Text);
SqlDataAdapter dap = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
dap.Fill(ds);
for (int i = 0; i < ds.Tables[0].Rows.Count; i )
{
textBox2.Text = Convert.ToString(ds.Tables[0].Rows[i]["billno"]);
maskedTextBox1.Text = Convert.ToString(ds.Tables[0].Rows[i]["date"]);
textBox1.Text = Convert.ToString(ds.Tables[0].Rows[i]["ledgeraccount"]);
textBox9.Text = Convert.ToString(ds.Tables[0].Rows[i]["totcts"]);
textBox7.Text = Convert.ToString(ds.Tables[0].Rows[i]["rround"]);
textBox13.Text = Convert.ToString(ds.Tables[0].Rows[i]["grosspurchase"]);
comboBox1.Text = Convert.ToString(ds.Tables[0].Rows[i]["taxes"]);
textBox8.Text = Convert.ToString(ds.Tables[0].Rows[i]["taxamt"]);
textBox6.Text = Convert.ToString(ds.Tables[0].Rows[i]["totdb"]);
textBox3.Text = Convert.ToString(ds.Tables[0].Rows[i]["narrat"]);
}
//mydgv.Columns.Clear();
string mysql = "select srno,particulars,carats,rate,debit from depurchasea"
" where companyID=@companyID"
" and transID=@transID";
SqlCommand mycmd = new SqlCommand(mysql, con);
mycmd.Parameters.AddWithValue("companyID", label6.Text);
mycmd.Parameters.AddWithValue("transID", textBox5.Text);
SqlDataAdapter mydap = new SqlDataAdapter(mycmd);
DataSet myds = new DataSet();
mydap.Fill(myds);
mybinding = new BindingSource();
mybinding.DataSource = myds;
mybinding.DataMember = myds.Tables[0].TableName;
mydgv.DataSource = mybinding;
mydgv.Columns[0].HeaderText = "Sr.No.";
mydgv.Columns[1].HeaderText = "Particulars";
mydgv.Columns[2].HeaderText = "Carats";
mydgv.Columns[3].HeaderText = "Rate";
mydgv.Columns[4].HeaderText = "Amount";
mydgv.Columns[0].Width = 50;
mydgv.Columns[1].Width = 500;
mydgv.Columns[4].Width = 100;
mydgv.Columns[2].Width = 100;
mydgv.Columns[3].Width = 100;
mydgv.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomRight;
mydgv.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomRight;
mydgv.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomRight;
mydgv.Columns[2].DefaultCellStyle.Format = "f2";
mydgv.Columns[3].DefaultCellStyle.Format = "f2";
mydgv.Columns[4].DefaultCellStyle.Format = "f2";
mydgv.Columns[4].ReadOnly = true;
int dgvsize = mydgv.Width / 17;
mydgv.Columns[0].Width = dgvsize;
mydgv.Columns[1].Width = dgvsize * 10;
mydgv.Columns[2].Width = dgvsize * 2;
mydgv.Columns[3].Width = dgvsize * 2;
mydgv.Columns[4].Width = dgvsize * 2;
mydgv.Refresh();
if (textBox13.Text != "")
{
decimal res = Convert.ToDecimal(textBox13.Text);
textBox13.Text = res.ToString("f2");
}
}
public partial class Form30 : Form
{
public Form30()
{
InitializeComponent();
}
private void listView1_KeyPress(object sender, KeyPressEventArgs e)
{
else if (textBox2.Text == "Purchase")
{
purchase_Entry pc = new purchase_Entry();
pc.lbl6.Text = pp.Form1.IDD.Text; //companyID
pc.Purchase_Binding() //Calling public method of purchase_entry Class
pc.ShowDialog(this);
pc.textboxKeypress = new purchase_Entry.Action(pc_textboxKeypress);
pc.purkeydown = new purchase_Entry.Action(pc_purkeydown);
}
}
Вызов метода Purchase_Binding() из формы purchase_Entry в методе Show() работает очень хорошо, но если я использую то же самое в методе ShowDialog(), то он отобразит записи, но выравнивание элементов управления будет изменено. Это означает, что я должен выдавать новое значение каждого элемента управления size, height, width и CompanyID для экземпляра, отображаемого в методе ShowDialog().
Если это так, то это будет работать для меня, потому что мне нужно перепроектировать purchase_Entry для ShowDialog()
метода.
Каков наилучший способ?.Если я использую метод Show(), то форма будет отображаться в окне инструментов ALT TAB, и я не хочу разрешать показывать ее в окне инструментов ALT TAB. Вот почему я использовал метод ShowDialog(), который будет отображаться как форма окна модели и не будет отображаться в окне инструментов ALT TAB.
И если я использую этот ShowDialog()
метод, я должен быть готов переделать его, как работает осел. Не так ли?
Комментарии:
1. Разве вы не можете вызвать метод в конструкторе?
2. @V4Vendetta, смотрите мой отредактированный вопрос.
3. Не уверен, что вы хотите сделать, теперь form_load будет выполняться только после
ShowDialog
того, как ваша метка не установлена, поэтому она отображается пустой4. Почему вы инициализируете label1 в методе Form_Load? Разве это не может быть сделано в конструкторе? Проблема, с которой вы столкнулись, проста, как указывает V4Vendetta.
5. @tafa, это просто пример, я всегда против передачи параметризации в конструкцию формы, потому что это создаст проблему перегрузки при каждом новом экземпляре форм. и это только одно значение, что произойдет, если для него должно быть доступно более одного значения.
Ответ №1:
Попробуйте изменить порядок вызовов.
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.moto();
f2.ShowDialog();
}
Причина, по которой вы не видите эффекта от вызова moto при использовании ShowDialog, заключается в том, что ShowDialog блокирует текущий выполняющийся поток до тех пор, пока форма не будет закрыта, то есть метод moto не вызывается до тех пор, пока форма не будет закрыта.
Комментарии:
1. Это правда, что изменение порядка вызовов решит проблемы. но это не позволит никакого дальнейшего доступа к form2. и я хочу дальнейшего доступа к form2, поэтому я не могу изменить порядок.
2. Что вы подразумеваете под дальнейшим доступом?
3. @V4Vendetta, здесь дальнейший доступ означает предположение, что если у меня есть значение ID в form2, и мой метод зависит от значения ID, чем если я изменю порядок ShowDialog, то он выдаст ошибку о пустом значении ID.
4. @tafa, смотрите мое новое редактирование, предыдущее — небольшой пример моей реальной проблемы, как указано выше.
Ответ №2:
Я надеюсь, что это может вам помочь
Это ваш конструктор по умолчанию, сделайте больше в соответствии с входными данными
public Form2()
{
InitializeComponent();
}
public Form2(int id)
{
InitializeComponent();
if(id == 101)
textBox1.Text = "MAHESH";
}
public Form2(string name)
{
InitializeComponent();
textBox1.Text = name;
}
Выполните вызов по своему усмотрению и передайте значение, вы можете инкапсулировать дальнейшую обработку в разные методы и выполнить вызов.
Загрузка новой формы будет выполняться только после ShowDialog()
Комментарии:
1. На самом деле я против передачи paramaterized в конструкцию формы. потому что это не очень хорошая идея для использования.
2. Я думаю, что метод ShowDialog() имеет ограниченный доступ, тогда метод Show() определяет форму
Ответ №3:
Form.ShowDialog показывает форму в модальном режиме. Это означает, что приведенный ниже код Form.ShowDialog никогда не будет выполняться, пока форма открыта.
В вашем случае, если ваш метод зависит от ID, вы должны инициализировать ID перед вызовом f2.moto() , например, перед ShowDialog .
public partial class Form2 : Form
{
public Form2(int id)
{
InitializeComponent();
label1.Text = id.ToString();
}
public void moto()
{
textBox1.Text = "MAHESH";
}
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(101);
f2.moto();
f2.ShowDialog();
}
Редактировать:
Если вы не используете параметризованный конструктор формы, вы также должны инициализировать Id перед вызовом ShowDialog.
Используйте идентификатор общедоступного свойства в классе Form2:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void moto()
{
textBox1.Text = "MAHESH";
}
public int Id
{
set {label1.Text = value.ToString();}
}
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Id = 101;
f2.moto();
f2.ShowDialog();
}
Комментарии:
1. Извините, но я против передачи параметров в построении формы. здесь это не очень хорошая идея.
2. Таким образом, вы можете инициализировать идентификатор, используя другие методы. Например, используя идентификатор общедоступного свойства в Form2. Или вы можете создать общедоступный метод ShowAndInitId(int id) { label1 . Текст = идентификатор. toString(); ShowDialog();} И вызовите этот метод вместо f2.ShowDialog();
3. Я в замешательстве, можете ли вы отредактировать свои комментарии в свой первоначальный ответ с подробностями
4. Затем я должен задать один ценный вопрос относительно того же, и вопрос заключается в следующем: если я использую showdialog, чем я должен передавать каждое значение параметра в экземпляре формы ?. Если form2 имеет управление и много идентификаторов, чем я должен снова пройти для того же ?.
5. … Если многие элементы управления form2 настраиваются друг с другом по высоте и ширине, я должен выдать новое значение для того же. верно?.