버튼을 클릭하면 ShowDialog ()를 통해 다른 양식 (frmImportContact)을 보여주는 기본 MDI 양식 (frmMainMDI)의 자식 인 기본 양식 (frmHireQuote라고 함)이 있습니다.
사용자가 frmImportContact에서 ‘확인’을 클릭하면 frmHireQuote의 일부 텍스트 상자에 몇 가지 문자열 변수를 다시 전달하고 싶습니다.
frmHireQuote의 인스턴스가 여러 개있을 수 있으므로 frmImportContact의이 인스턴스를 호출 한 인스턴스로 돌아가는 것이 중요합니다.
가장 좋은 방법은 무엇입니까?
답변
온 일부 공공 속성 만들기 하위 양식 과 같이를
public string ReturnValue1 {get;set;}
public string ReturnValue2 {get;set;}
그런 다음 하위 양식 확인 버튼 클릭 핸들러 안에 설정 하십시오.
private void btnOk_Click(object sender,EventArgs e)
{
this.ReturnValue1 = "Something";
this.ReturnValue2 = DateTime.Now.ToString(); //example
this.DialogResult = DialogResult.OK;
this.Close();
}
그런 다음 frmHireQuote 양식 에서 하위 양식을 열 때
using (var form = new frmImportContact())
{
var result = form.ShowDialog();
if (result == DialogResult.OK)
{
string val = form.ReturnValue1; //values preserved after close
string dateString = form.ReturnValue2;
//Do something here with these values
//for example
this.txtSomething.Text = val;
}
}
또한 하위 양식 을 취소 하려면 양식에 버튼을 추가하고 DialogResult 를 설정하고 양식 Cancel
의 CancelButton 속성을 해당 버튼으로 설정할 수도 있습니다. 그러면 탈출 키가 취소됩니다. 형태의.
답변
나는 일반적으로 양식 / 대화 상자에 정적 메소드를 작성하여 호출 할 수 있습니다. 입력해야하는 값과 함께 성공 (확인 단추) 또는 실패를 반환합니다.
public class ResultFromFrmMain {
public DialogResult Result { get; set; }
public string Field1 { get; set; }
}
그리고 형태 :
public static ResultFromFrmMain Execute() {
using (var f = new frmMain()) {
var result = new ResultFromFrmMain();
result.Result = f.ShowDialog();
if (result.Result == DialogResult.OK) {
// fill other values
}
return result;
}
}
당신의 양식을 호출;
public void MyEventToCallForm() {
var result = frmMain.Execute();
if (result.Result == DialogResult.OK) {
myTextBox.Text = result.Field1; // or something like that
}
}
답변
이 코드에서 또 다른 작은 문제를 발견했습니다 … 또는 적어도 그것을 구현하려고 할 때 문제가있었습니다.
frmMain의 버튼은 VS2010을 사용하여 호환되는 값을 반환하지 않습니다. 다음을 추가하고 모든 것이 제대로 작동하기 시작했습니다.
public static ResultFromFrmMain Execute() {
using (var f = new frmMain()) {
f.buttonOK.DialogResult = DialogResult.OK;
f.buttonCancel.DialogResult = DialogResult.Cancel;
var result = new ResultFromFrmMain();
result.Result = f.ShowDialog();
if (result.Result == DialogResult.OK) {
// fill other values
}
return result;
}
}
두 개의 버튼 값을 추가하면 대화 상자가 훌륭하게 작동했습니다! 예를 들어 주셔서 감사합니다. 정말 도움이되었습니다.
답변
방금 생성자에 참조로 무언가를 넣었으므로 하위 양식은 값을 변경할 수 있으며 기본 양식은 하위 양식에서 새 객체 또는 수정 된 객체를 가져올 수 있습니다.
답변
나는 MDI를 상당히 많이 사용하며 여러 부동 형식보다 훨씬 더 (사용할 수있는 곳) 좋아합니다.
그러나 그것을 최대한 활용하려면 자신의 이벤트를 파악해야합니다. 인생이 훨씬 쉬워집니다.
골격 예.
자신의 무차별 유형을 가지고
//Clock, Stock and Accoubts represent the actual forms in
//the MDI application. When I have multiple copies of a form
//I also give them an ID, at the time they are created, then
//include that ID in the Args class.
public enum InteruptSource
{
IS_CLOCK = 0, IS_STOCKS, IS_ACCOUNTS
}
//This particular event type is time based,
//but you can add others to it, such as document
//based.
public enum EVInterupts
{
CI_NEWDAY = 0, CI_NEWMONTH, CI_NEWYEAR, CI_PAYDAY, CI_STOCKPAYOUT,
CI_STOCKIN, DO_NEWEMAIL, DO_SAVETOARCHIVE
}
그런 다음 자신의 Args 유형
public class ControlArgs
{
//MDI form source
public InteruptSource source { get; set; }
//Interrupt type
public EVInterupts clockInt { get; set; }
//in this case only a date is needed
//but normally I include optional data (as if a C UNION type)
//the form that responds to the event decides if
//the data is for it.
public DateTime date { get; set; }
//CI_STOCKIN
public StockClass inStock { get; set; }
}
그런 다음 네임 스페이스 내에서, 클래스 외부에서 델리게이트를 사용하십시오.
namespace MyApplication
{
public delegate void StoreHandler(object sender, ControlArgs e);
public partial class Form1 : Form
{
//your main form
}
이제 수동으로 또는 GUI를 사용하여 MDIparent가 자식 양식의 이벤트에 응답하게합니다.
그러나 owr Args를 사용하면이를 단일 기능으로 줄일 수 있습니다. 그리고 interupts를 방해하고, 디버깅에는 유용하지만 다른 방법으로도 유용 할 수 있습니다.
mdiparent 이벤트 코드 중 하나가 하나의 함수를 가리 키도록하십시오.
calendar.Friday += new StoreHandler(MyEvents);
calendar.Saturday += new StoreHandler(MyEvents);
calendar.Sunday += new StoreHandler(MyEvents);
calendar.PayDay += new StoreHandler(MyEvents);
calendar.NewYear += new StoreHandler(MyEvents);
간단한 스위치 메커니즘만으로도 적절한 형식으로 이벤트를 전달할 수 있습니다.
답변
당신은 데이터 전달하려는 경우 form2
에서를 form1
새 것처럼 거치지 않고form(sting "data");
양식 1에서 그렇게하십시오.
using (Form2 form2= new Form2())
{
form2.ReturnValue1 = "lalala";
form2.ShowDialog();
}
형태 2에 추가
public string ReturnValue1 { get; set; }
private void form2_Load(object sender, EventArgs e)
{
MessageBox.Show(ReturnValue1);
}
또한 form1
무언가를 바꾸고 싶다면 이와 같은 가치를 사용할 수 있습니다form1
form1에서
textbox.Text =form2.ReturnValue1
답변
먼저 form2 (child)에서 속성을 정의해야합니다. form2에서 그리고 form1 (parent)에서이 속성을 업데이트합니다 :
public string Response { get; set; }
private void OkButton_Click(object sender, EventArgs e)
{
Response = "ok";
}
private void CancelButton_Click(object sender, EventArgs e)
{
Response = "Cancel";
}
form1 (parent)에서 form2 (child) 호출 :
using (Form2 formObject= new Form2() )
{
formObject.ShowDialog();
string result = formObject.Response;
//to update response of form2 after saving in result
formObject.Response="";
// do what ever with result...
MessageBox.Show("Response from form2: "+result);
}