我想从我的主窗体重新访问我的一些子用户控件..我想访问我从 WatchListUC watch = new WatchListUC(); 声明的对象“watch”;
从我的主要我已经在主窗体的面板上声明了这个用户控件
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
实例,则不需要这样做。
关于c# - 如何重新访问之前在子控件中声明的用户控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812074/