我有两种形式:
Form1
包含DataGridView
次控件
Form2
包含Textbox
个控件(模式只读),checkBox和Button。
当我选择一个DataGridView
行时,它会显示Form2并在TextBoxes中显示它们的值。刚才一切似乎都好一些。
我想知道的是在文本框中显示数据后,我检查RadioButton,然后单击它将返回到所选行的Form1的按钮,并自动更改Cell 4的值。
这里有我的代码:
Form1
private void dataGridView1_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
DataGridViewCell cell = null;
foreach (DataGridViewCell selectedCell in dataGridView1.SelectedCells)
{
cell = selectedCell;
break;
}
if (cell != null)
{
DataGridViewRow row = cell.OwningRow;
string objet = row.Cells[0].Value.ToString();
string objectif = row.Cells[1].Value.ToString();
string date = row.Cells[2].Value.ToString();
string commentaire = row.Cells[3].Value.ToString();
string client = row.Cells[5].Value.ToString();
string commercial = row.Cells[6].Value.ToString();
Détails_RDV détails = new Détails_RDV();
détails.obj = objet;
détails.objectif = objectif;
détails.date = date;
détails.comm = commentaire;
détails.clt = client;
détails.commer = commercial;
détails.Show();
}
}
窗体2
public partial class Détails_RDV : Form
{
public string obj ;
public string objectif;
public string date;
public string comm;
public string clt ;
public string commer;
public Détails_RDV()
{
InitializeComponent();
}
private void Détails_RDV_Load(object sender, EventArgs e)
{
txtObjet.Text = obj;
txtObjectif.Text = objectif;
txtDate.Text = date;
txtCommerci.Text = commer;
txtClient.Text = clt;
txtCommentaire.Text = comm;
}
private void btnValider_Click(object sender, EventArgs e)
{
if (checkEffectue.Checked == true)
{
//What should I write here??
Liste_RDV lrdv = new Liste_RDV();
lrdv.Show();
}
}
我该怎么做?
答案 0 :(得分:1)
在Form2
上的按钮点击事件中,检查是否选中了复选框,只需将DialogResult
设置为OK
,否则将其设置为Cancel
:
if (checkBox1.Checked)
this.DialogResult = System.Windows.Forms.DialogResult.OK;
else
this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
在Form1
,而不是Show
,使用ShowDialog
并检查结果是否为OK
,执行您需要的更新:
var f2 = new Form2();
//Set values
if(f2.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
//Perform update here
}
这样每个表单都有自己的责任,您可以在Form1
中编写与Form1
相关的代码,而不需要在Form2
中编写它们。
答案 1 :(得分:0)
您可以在子表单上创建一个事件并触发它,如下例所示:
public partial class Détails_RDV : Form
{
public string obj;
public string objectif;
public string date;
public string comm;
public string clt;
public string commer;
**// Event fired on effectue checkbox change
public class EffectueEventArgs : EventArgs
{
public EffectueEventArgs(bool val)
{
Effectue = val;
}
public bool Effectue { get; private set; }
}
public delegate void EffectueChangeHandler(object src, EffectueEventArgs e);
public event EffectueChangeHandler OnEffectueChange;**
public Détails_RDV()
{
InitializeComponent();
}
private void Détails_RDV_Load(object sender, EventArgs e)
{
txtObjet.Text = obj;
txtObjectif.Text = objectif;
txtDate.Text = date;
txtCommerci.Text = commer;
txtClient.Text = clt;
txtCommentaire.Text = comm;
}
private void btnValider_Click(object sender, EventArgs e)
{
if (checkEffectue.Checked == true)
{
**// Notify any event listener of change
if (OnEffectueChange != null)
OnEffectueChange (this, new EffectueEventArgs(true);**
this.Close();
}
}
}
然后,当您创建子表单时,您可以订阅该事件并注册适当的处理程序,例如
Détails_RDV détails = new Détails_RDV();
détails.obj = objet;
détails.objectif = objectif;
détails.date = date;
détails.comm = commentaire;
détails.clt = client;
détails.commer = commercial;
**détails.OnEffectueChange += (src, e) => { row.Cells[4].Value = e.Effectue; };**
détails.Show();
或者你可以利用INotifyPropertyChanged,或者确实指定一个显式的回调委托,Action或Function。