我想从我的主窗体中重新访问一些子用户控件。我想访问我从WatchListUC声明的对象“ watch” watch = new WatchListUC();
从我的主我已经在主窗体的面板上声明了此用户控件
private void MyList_Load(object sender, EventArgs e)
{
LogInScreen screen = new LogInScreen();
panel2.Controls.Clear();
panel2.Controls.Add(screen);
loadDB();
grid.ContextMenuStrip = OpenDetails;
}
然后,我创建了一个登录名,然后就可以调用WatchListUC watch = new WatchListUC();了。我稍后想回想一下
在登录屏幕上,这是代码
private void LogIn_Click(object sender, EventArgs e)
{
SuspendLayout();
try
{
MySqlConnection conn = new MySqlConnection(myConnection);
conn.Open();
MySqlCommand command = new MySqlCommand("SELECT * FROM maindatabase.users where user=?parameter1 and pass=?parameter2;", conn);
command.Parameters.AddWithValue("?parameter1", User.Text);
command.Parameters.AddWithValue("?parameter2", Pass.Text);
MySqlDataReader reader = command.ExecuteReader();
int ctr = 0;
while (reader.Read())
{
ctr++;
// controlnum = reader["idnum"].ToString();
MyList.AccountControlNum = int.Parse(reader["idnum"].ToString());
// MessageBox.Show(MyList.AccountControlNum.ToString());
}
if (ctr == 1)
{
this.Parent.Controls.Remove(this);
MyList my = MyList.ActiveForm as MyList;
UserAccount acc = new UserAccount();
my.panel2.Controls.Add(acc);
my.label1.Text = reader["user"].ToString()+" 'List";
WatchListUC watch = new WatchListUC();
my.panel3.Controls.Clear();
my.panel3.Controls.Add(watch);
FinishListUC finish = new FinishListUC();
my.panel4.Controls.Clear();
my.panel4.Controls.Add(finish);
// MessageBox.Show("Success!");
}
else
{
MessageBox.Show("Invalid Username or Password!");
}
conn.Close();
ResumeLayout();
}
catch (Exception ex)
{
MessageBox.Show("error" + ex);
ResumeLayout();
}
ResumeLayout();
}
现在在我的主窗体上,如何在“ insertWL()”方法之后在这里重新访问?
void ConfirmedWL()
{
SuspendLayout();
try
{
MySqlConnection conn = new MySqlConnection(myConnection);
conn.Open();
MySqlCommand command = new MySqlCommand("SELECT * FROM maindatabase.watchlist where ControlNum=?CN and idnum=?ID;", conn);
command.Parameters.AddWithValue("?CN", int.Parse(a.ToString()));
command.Parameters.AddWithValue("?ID", MyList.AccountControlNum);
MySqlDataReader reader = command.ExecuteReader();
int ctr = 0;
while (reader.Read())
{
ctr++;
}
if (ctr == 1)
{
MessageBox.Show("Already Existed!");
}
else
{
insertWL();
//WatchListUC watch1 = panel3.Controls.Find("watch", true).DefaultIfEmpty() as WatchListUC;
//watch1.dvgRefresh();
//here i want to recall the watch so i can call the method dvgRefresh();
}
conn.Close();
ResumeLayout();
}
catch { }
}<br>
我希望有人可以帮助我,这是我的完整代码和屏幕截图http://www.mediafire.com/download/1l18e6v8158mi16/Help_please.rar
UserControl
是视觉对象,可以像每个对象一样使用。
这意味着您可以将它们的引用存储在最适合您的范围内的任何变量中。
在您的示例中,我将watch
在“表单”级别进行定义:
WatchListUC watch;
然后,在LogIn_Click
事件方法中,这样做没有错:
watch = new WatchListUC();
my.panel3.Controls.Clear();
my.panel3.Controls.Add(watch);
最后,在ConfirmedWL
方法中,只需使用watch
您拥有的实例即可。
...
else
{
insertWL();
watch.dvgRefresh();
}
这种方法的缺点是您必须注意控件的生命周期:
watch
会null
如果没有实例化,这可能会导致NullReferenceException
如果您尝试使用它没有把新的控制里面。.Dispose()
在完成操作后立即调用您即时创建的控件。如果您计划WatchListUC
在应用程序生命周期中仅拥有一个实例,则不需要这样做。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句