我正在编写一个C#桌面应用程序,它利用dll(我写的)从数据库中检索数据。
dll具有多种功能,具体取决于用户想要的数据。我想在我的应用程序的UI上更新标签,因为数据库函数已在dll中完成。
我的代码布局如下:
应用:
private void getData(object sender, EventArgs e)
{
dll.DoDatabaseFunctions();
}
DLL:
public static DataTable getThisStuff
{
//connections to SQL DB and runs command
//HERE is where I would like to send something back to the application to update the label
}
public static DataTable getThatStuff
{
//connections to SQL DB and runs command
//HERE is where I would like to send something back to the application to update the label
}
任何想法都将不胜感激!
答案 0 :(得分:1)
在您的dll课程中创建一个event
,您可以在gui中订阅。
在你的dll中声明事件:
public event Action DataReady;
在需要时提升dll中的事件:
DataReady?.Invoke();
或
var dataReady = DataReady;
if (dataReady != null)
dataReady();
订阅gui中的活动:
dll.DataReady += OnDataReady;
在引发事件时更新gui中的标签:
public void OnDataReady()
{
label.Text = "Whatever";
}
如果您需要参数,可以将Action<T1,..,Tn>
用于您的活动。例如:
public event Action<string> DataReady;
DataReady?.Invoke("data");
dll.DataReady += OnDataReady;
public void OnDataReady(string arg1)
{
label.Text = arg1;
}
最后,在不再需要时取消订阅活动:
dll.DataReady -= OnDataReady;
答案 1 :(得分:0)
您可以使用活动。在你的dll类中定义一个事件,你不能真正使用静态,因为你需要有一个实例(静态事件不是一个好主意)。
这样的事情:
private void getData(object sender, EventArgs e)
{
var dllInstance = new Dll();
dll.Updated += dllUpdateReceived;
dllInstance.DoDatabaseFunctions();
}
private void dllUpdateReceived(object sender, DllUpateEventArgs e)
{
var updateDescription = e.UpdateDescription;
// TODO: Update a label with the updates
}
dll项目中必要的东西:
public class DllUpdateEventArgs: EventArgs {
public string UpdateDescription { get; set; }
}
public class Dll {
public event EventHandler<DllUpdateEventArgs> Updated;
private void OnUpdated(string updateDescription) {
var updated = Updated;
if (updated != null) {
updated(this, new DllUpdateEventArgs { UpdateDescription = updateDescription });
}
}
public void DoDatabaseFunctions() {
// Do things
OnUpdated("Step 1 done");
// Do more things
OnUpdated("Step 2 done");
// Do even more things
OnUpdated("Step 3 done");
}
}