Как обновить текст в метке - PullRequest
3 голосов
/ 31 октября 2011

У меня есть длинный метод, выполнение которого занимает немного времени.Я хотел бы развлечь пользователя, поэтому я создал индикатор выполнения и метку.Я хотел бы, чтобы этот ярлык изменился, пока система выполняет прогресс.Я смотрел на Application.DoEvents (), но кажется, что это неправильный путь.Это приложение довольно простое, просто проект и ничего профессионального.Все, что делает это приложение - отправляет файл клиенту и вставляет данные в базу данных.

У меня есть одна метка (помимо метки успеха и ошибок), которую я хотел бы постоянно обновлять вместе с индикатором выполнения.Есть идеи или советы, как это сделать?Будет ли Application.DoEvents () приемлемым в этой ситуации?Или есть простой способ обновить текст.Я использую C #, asp.net и System.Web.UI.Page.Любая помощь или указание мне в правильном направлении будет принята с благодарностью.

protected void Button_Click(object sender, EventArgs e)
{
    PutFTPButton.Enabled = false;
    Thread.Sleep(3000);
    Button btn = (Button)sender;
    KaplanFTP.BatchFiles bf = new KaplanFTP.BatchFiles();
    KaplanFTP.Transmit transmit = new KaplanFTP.Transmit();
    //label text change here
    if (btn.ID == PutFTPButton.ID)
    {
        //bf.ReadyFilesForTransmission();
        DirectoryInfo dir = new DirectoryInfo(@"C:\Kaplan");

        FileInfo[] BatchFiles = bf.GetBatchFiles(dir);

        bool result = transmit.UploadBatchFilesToFTP(BatchFiles);
        //label text change here
        if (!result)
        {
            ErrorLabel.Text += KaplanFTP.errorMsg;
            return;
        }

        bf.InsertBatchDataIntoDatabase("CTL");
        bf.InsertBatchDataIntoDatabase("HDR");
        bf.InsertBatchDataIntoDatabase("DET");
        bf.InsertBatchDataIntoDatabase("NTS");
        List<FileInfo> allfiles = BatchFiles.ToList<FileInfo>();
        allfiles.AddRange(dir.GetFiles("*.txt"));
        bf.MoveFiles(allfiles);
        //label text change here
        foreach (string order in bf.OrdersSent)
        {
            OrdersSentDiv.Controls.Add(new LiteralControl(order + "<br />"));
        }
        //lblWait.Visible = false;
        OrdersSentDiv.Visible = true;
        OrdersInfoDiv.Visible = false;
        SuccessLabel.Visible = true;
        NoBatchesToProcessLbl.Visible = true;
        BatchesToProcessLbl.Visible = false;
        PutFTPButton.Enabled = false;
        BatchesCreatedLbl.Text = int.Parse(NextBatchNum).ToString();
        Thread.Sleep(20000);

        if (KaplanFTP.errorMsg.Length != 0)
        {
            ErrorLabel.Visible = true;
            SuccessLabel.Visible = false;
            ErrorLabel.Text = KaplanFTP.errorMsg;
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

Я думаю, что вы можете использовать элемент управления Ajax UpdateProgress, отметьте Индикатор выполнения при загрузке файла ASP.NET .

РЕДАКТИРОВАТЬ: Еще один Отображение прогрессаПанель для длительных процессов, использующих ASP.NET AJAX .

1 голос
/ 31 октября 2011
    delegate void SetTextCallback(string text);

    private void SetText(string text)
    {
        if (this.label1.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else this.label1.Text = text;
    } 
    void SomeMethod()
    {
        SetText(yourVariable.ToString());
    }

если я правильно вас понимаю, это должно сработать.

0 голосов
/ 31 октября 2011

Application.DoEvents () недоступен в приложении ASP.NET и не является приемлемым для использования в стандартном приложении WinForms с появлением многоядерных процессоров и библиотеки потоков .NET.

Веб-приложение требует связи с сервером. Поэтому простое обновление текста метки ничего не даст, если вы не отправите его обратно клиенту. В вашем случае вам понадобится событие, которое было сообщено этой строкой (потому что это пакетная загрузка):

transmit.UploadBatchFilesToFTP(BatchFiles); 

Событие обновит значение, которое вы хотите отобразить. Затем вам потребуется код AJAX (или панель обновления ASP.NET вокруг метки ASP.NET) на соответствующей веб-странице, чтобы получить и отобразить новое значение.

НТН

...