从dll更新C#桌面应用程序GUI

时间:2016-06-01 13:31:09

标签: c# dll desktop

我正在编写一个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
}

任何想法都将不胜感激!

2 个答案:

答案 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");
    }
}