通过Async方法和任务

时间:2016-01-18 07:42:47

标签: c# php mysql asp.net

我正在构建一个ASP.NET Web应用程序,它可以从MySQL数据库动态加载数据。我已经知道我可以在服务器上由另一个客户端控件触发的事件中更改客户端控件的属性(例如,单击按钮)。

也就是说,从数据库下载动态数据后,我无法以相同的方式更改控件。我认为这是因为我的数据下载完成后客户端已经呈现。有没有办法通知客户它应该重新加载页面以接收新下载的数据?也许我可以直接将数据发送给客户端?

在一个完美的世界中,动态数据将在Page_Load中开始下载,如下所示,并在收到并格式化数据后(在DownloadSchoolsInfo结束时)自动填充控件(在本例中为DropDown)。这可能吗?

感谢您的任何建议!

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Task task = new Task(DownloadSchoolsInfo);
        task.Start();
    }
}

async void DownloadSchoolsInfo()
{
    Task<string> task = StaticData.DoStringDownload("http://php.domain.com/php/getAllSchoolInfos.php");
    string s = await task;
    string[] schoolData = s.Split('\n');

    foreach (string line in schoolData)
    {
        string[] sArray = line.Split(';');
        StaticData.schools.Add(new SchoolInfo(sArray[0], sArray[1], sArray[2], sArray[3]));
    }

    dropDown_SchoolSelect.DataTextField = "name";
    dropDown_SchoolSelect.DataValueField = "code";
    dropDown_SchoolSelect.DataSource = StaticData.schools;
    dropDown_SchoolSelect.DataBind();
}

public static async Task<string> DoStringDownload(string url)
{
    var httpClient = new HttpClient();
    string s = await httpClient.GetStringAsync(url);
    return s;
}

1 个答案:

答案 0 :(得分:0)

使用DataContext和ObservableCollection不是很容易吗?

<ComboBox ItemsSource="{Binding Schools}" 
    SelectedItem="{Binding SelectedSchool}"
    />

在你的模特的某个地方,你有:

public class MainPageViewModel : BaseViewModel
{
    private ObservableCollection<string> _schools;
    private string _selectedSchool;

    public ObservableCollection<string> Schools
    {
        get { return _schools; }
        set
        {                
            _schools = new ObservableCollection<string>(value);
            NotifyPropertyChange("Schools");
        }
    }

    public string SelectedSchool
    {
        get { return _selectedSchool; }
        set
        {
            if (_selectedSchool == value)
                return;

            _selectedSchool = value;
            NotifyPropertyChange("SelectedSchool");
        }
    }
}

现在每当您更新Schools集合时,您的下拉列表都是最新的,page_load或其他任何内容。您还可以通过调用NotifyPropertyChange(string)方法强制更新。