我一直试图在两天的大部分时间里解决这个问题并且到处寻找解决方案,所以如果这很容易回答,我会在前面道歉。另外,我对c#和一般编程都很新。
我有一个form,其中一个按钮会创建一个新的usercontrol。此用户控件具有listview(现在,在某些时候我可能会将其更改为datagridview),该视图使用来自Access数据库的信息进行更新。单击表单上的另一个按钮(保存)时,信息将添加到数据库中。我想让我的UserControl检测点击Save按钮的时间并更新listview。
以下是我的代码中的一个示例,将其缩小到我希望的重要位。
表格。
public partial class Form1 : Form
{
public event EventHandler saveClick;
public Form1()
{
InitializeComponent();
}
public void buttonSave_Click(object sender, EventArgs e)
{
//Stuff happens here that saves all input to the database
if (this.saveClick != null)
this.saveClick(this, e);
}
//Creates the UserControl TodayCallHistory as tch and expands Form1 window to accomodate the new control
private void butListShow_Click(object sender, EventArgs e)
{
if (!expanded)
{
expanded = true;
butListShow.Text = "\u25C0";
TodayCallHistory tch = new TodayCallHistory();
tch.Name = "tch";
tch.SetParentForm(this); //This was added per the answer below
List<int> pos = new List<int>();
foreach (Control x in this.Controls)
{
int right = x.Right;
pos.Add(right);
}
tch.Location = new System.Drawing.Point(pos.Max() + 10, 10);
formWidth = this.Width;
this.Width = this.Width + tch.Width + 10;
this.Controls.Add(tch);
}
else
{
expanded = false;
butListShow.Text = "\u25B6";
foreach (Control x in this.Controls)
{
if (x.Name == "tch")
this.Controls.Remove(x);
}
this.Width = formWidth;
}
}
}
UserControl东西。
public partial class TodayCallHistory : UserControl
{
private Form1 frm = new Form1();
public TodayCallHistory()
{
InitializeComponent();
//frm.saveClick += new EventHandler(saveWasClicked); Removed based on answer below
}
//This following part was added per the marked answer below
public void SetParentForm(Form1 parent)
{
frm = parent;
frm.saveClick += new EventHandler(saveWasClicked);
}
private void saveWasClicked(object sender, EventArgs e)
{
refreshList();
}
private void refreshList()
{
//Sends query to database and then populates a listview with this information
}
}
在表单上单击“保存”按钮时,UserControl上没有任何操作。只是一大堆没什么。如果有人能告诉我我做错了什么或者更好的方法来解决这个问题,我将非常感激!如果我没有足够的分享,我也可以发布更多代码。
编辑1:我还应该提到这是一个WinForm,使用Visual Studio Express 2015 for Windows Desktop用c#编写。
编辑2:在Form1上单击按钮时添加了用于创建UserControl的代码。相同的按钮也会删除控件。基本上我想要一个&#34;扩展窗口&#34; (我不知道实际术语应该是什么)功能是我Form1的一部分。
编辑3:使用Harrison Paine(不确定如何标记用户名)建议如下,我将SetParentForm方法添加到UserControl。由于我的UserControl没有创建,直到单击Form1上的按钮,我必须在Form1创建后添加SetParentForm。
在
之后tch.Name = "tch";
我添加了
tch.SetParentForm(this);
编辑4:为了避免创建新的Form1,我进行了以下更改。
Form1中
public static event EventHandler saveClick; //Added static modifier
public void buttonSave_Click(object sender, EventArgs e)
{
//Stuff happens here that saves all input to the database
if (Form1.saveClick != null)
Form1.saveClick(this, e); //Changed this.saveClick to Form1.saveClick
}
private void butListShow_Click(object sender, EventArgs e)
{
tch.Parent = this; //All the other stuff from above, plus this now
}
我将this.saveClick
更改为Form1.saveClick
,因为它有静态修饰符(我大多猜到我必须这样做,而且我仍然在努力理解究竟是什么&#39;静态&#39;做什么? )
用户控件
public TodayCallHistory()
{
Form1.saveClick += new EventHandler(saveWasClicked);
InitializeComponent();
}
我删除了Form1 frm = new Form1();
以及整个SetParentForm
方法。
对于那些想知道为什么我没有创建UserControl并且始终在那里,只有.Visible
设置为True
或False
的人,我经过多次阅读后确定&#34;更好的做法&#34;是根据需要创建和销毁控件,特别是如果表单上有很多控件。如果我对此完全偏离基础/疯狂,请告诉我,以便我可以轻松解决问题:)
答案 0 :(得分:0)
您的TodayCallHistory
似乎正在创建自己的Form1
,并在该对象上收听事件。
您需要传入具有用户控件的实际Form1
,然后在该对象上注册事件处理程序。
这样的事情:
在TodayCallHistory.cs
:
public void SetParentForm(Form1 parent)
{
frm = parent;
frm.SaveClick += new EventHandler(saveWasClicked);
}
在Form1.cs
:
public Form1
{
InitializeComponent();
this.myTodayCallHistory.SetParentForm(this);
}
问题源于以下几点:
public partial class TodayCallHistory : UserControl
{
private Form1 frm = new Form1();
此处创建的Form1
是一个完全不同的对象,而不是“原始”对象,您点击了其保存按钮。您需要以某种方式传递原始对象,而不是创建一个全新的对象。 SetParentForm()
方法只是一种方法。