我有两种形式,Form1和Form2。运行程序时,Form1是启动的表单。然后我想调用Form2,在Form1前面显示它,在Form2中执行一些操作,然后在没有任何输入的情况下自动关闭Form2,这样用户就可以继续使用Form1。
我尝试了以下内容:
string[] dobArrayKey = {"dob: "};
string[] dobArrayValue = {txtDob.Text};
string[] ptntNumArrayKey = { "PatientID: " };
string[] ptntNumArrayValue = { txtOfficeMR.Text};
string[] nameArrayKey = { "FirstName: ", "LastName: " };
string[] nameArrayValue = { txtFirstname.Text, txtLastname.Text };
List<List<string>> searchResults = new List<List<string>>();
Dictionary<string[], string[]> searchCriteria = new Dictionary<string[], string[]>
{
{dobArrayKey,dobArrayValue}
,{ptntNumArrayKey,ptntNumArrayValue}
,{nameArrayKey,nameArrayValue}
};
foreach (var item in searchCriteria)
{
if (item.Value[0] != "" && item.Value[0] != null)
{
searchResults.Add(new List<string>());
for (int x = 0; x <= item.Key.Count(); x++)
{
string strJSON = doPatientSearch(Convert.ToInt32(au.UserID)
, Convert.ToInt32(Session["PracticeID"]), au.SessionID, item.Key[x].ToString() : item.Value[x].ToString() );
PatientSearchResponse ptLi = JsonConvert.DeserializeObject<PatientSearchResponse>(json2);
foreach (PatientList3 patient in ptLi.PatientList)
{
searchResults[x].Add(patient.PatientNumber);
}
}
}
}
public static string doPatientSearch(int UserID, int PracticeID, string SessionID, string PatientID = null,
,string first = null, string last = null, string dob = null, string social = null)
{
//search
}
当我尝试这个时,我得到一个带有“无法访问已处置对象”消息的ObjectDisposedException。我试过在网上搜索,但没找到任何东西。我尝试过使用this.Dispose(),以及使用.Show()代替.ShowDialog()。我正在努力以这种方式实现目标吗?
我已经考虑过让Form2成为自己的.exe并调用.exe作为替代方案,但我想在重写所有内容之前我会问StackOverflow的专家。
答案 0 :(得分:3)
正如Markus所说,因为Form2
构造函数调用了this.Close()
,所以一旦行Form2 otherForm = new Form2();
完成,Form2窗口就会关闭。
close()
方法除了关闭窗口(以及任何拥有的窗口)之外还释放资源。因此,在以下行中,当调用otherForm.ShowDialog();
时,它无法访问otherForm
(已经处置)并抛出ObjectDisposedException
。这解释了您遇到异常的原因。
要解决此问题,请从Form2构造函数中删除this.Close()
。您仍然需要调用close()
方法,但是在构造函数之外并在完成Form2中要执行的操作之后执行此操作。
例如:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Form2 otherForm = new Form2();
otherForm.Show(this);
otherForm.DoStuff();
//do more stuff here after Form2 has opened and closed
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void DoStuff()
{
// do stuff here as you wish
// close method goes here
}
}
答案 1 :(得分:2)
你必须致电
//Do some stuff
this.close()
以后 - 不在构造函数中 - 但是在Form.Activated事件中。
样品:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
var form2 = new Form2();
form2.ShowDialog();
//Stuff Done
MessageBox.Show("Stuff Done");
}
}
public partial class Form2 : Form {
public Form2() {
InitializeComponent();
Activated += DoSomeStuff;
}
private async void DoSomeStuff(object sender, EventArgs e) {
//Do You Stuff here
await Task.Run(() => Thread.Sleep(2000));
this.Close();
}
}