0

デリゲートに渡すメッセージでラベルを更新する必要がある aspx Web ページがありますが、これを行うたびにラベルが更新されません。以下にいくつかのコードを示します。

default.aspx

<!-- This table has a surrounding updatepanel -->
<asp:TableRow>
    <asp:TableCell><asp:Button id="encrypteer" Text="Encrypteer" runat="server" OnClick="encrypteer_Click" ToolTip="Encrypteer uw bestand" /></asp:TableCell>
    <asp:TableCell><asp:Button id="decrypteer" runat="server" Text="Decrypteer" OnClick="decrypteer_Click" ToolTip="Decrypteer uw bestand" /></asp:TableCell>
</asp:TableRow>

<asp:TableRow ForeColor="Blue">
    <asp:TableCell ID="infoCell" runat="server" ColumnSpan="2">
        Info: <asp:Label ID="lblInfo" runat="server" Text="Cryptografie nog niet gestart." />
    </asp:TableCell>
</asp:TableRow>
<asp:TableRow ForeColor="Red">
    <asp:TableCell ID="errorCell" runat="server" ColumnSpan="2">
        Fouten: <asp:Label ID="lblError" runat="server" Text="Geen fouten." />
    </asp:TableCell>
</asp:TableRow>

default.aspx.cs (分離コード):

protected void encrypteer_Click(object sender, EventArgs e)
{
    if (getKeys())
    { // Ingevoerde sleutels ophalen
        if (taal.SelectedIndex == 0) //crypto.DoCryptFile(EncryptNoLibraries.CryptType.ENCRYPT, sleutels); // en deze meegeven in de encryptieklasse
        {
            crypto = new EncryptNoLibraries(@"C:\Users\Robbie\TestDES\test.txt", @"C:\Users\Robbie\TestDES\des.txt");
            crypto.feedbackInfo += new EncryptNoLibraries.Feedback(setFeedback);

            object[] allArgs = { EncryptNoLibraries.CryptType.ENCRYPT, lstSleutels };
            object args = allArgs;
            ThreadPool.QueueUserWorkItem(new WaitCallback(crypto.DoCryptFile), args);
        }
        else if (taal.SelectedIndex == 1)
            EncryptLibraries.EncryptFile(@"C:\Users\Robbie\TestDES\test.txt", @"C:\Users\Robbie\TestDES\des.txt", txtSleutel.Text);
    }
}

最後に、イベントとデリゲートが存在するクラス:

public class EncryptNoLibraries
{
    public event Feedback feedbackInfo;
    public EventArgs e = null;
    public delegate void Feedback(String message, bool info);

    public enum CryptType : int { ENCRYPT, DECRYPT };
    private CryptType cryptType;

    //More irrelevant declarations


    public EncryptNoLibraries()
    { }

    public EncryptNoLibraries(String strFilePath, String strPathToSave)
    {
        this.strPathForSourceFile = strFilePath;
        this.strPathToDestinationFile = strPathToSave;
    }

    public void DoCryptFile(object args)
    {
        //CryptType type, List<byte[]> desSleutels
        object[] allArgs = (object[])args;
        cryptType = (CryptType) allArgs[0];
        sleutels = (List<byte[]>) allArgs[1];

        if (cryptType == CryptType.ENCRYPT)
            strType = "encrypteren";
        else
            strType = "decrypteren";

        if (strPathForSourceFile.Equals(String.Empty)) // Als geen bestand gekozen werd...
            feedbackInfo(String.Format("Kies een bestand voor u gaat {0}.", strType), false); // geven we een gepaste tekst.
        else
        {
            List<BitArray> lstSplittedFile = splitFileIntoBlocksOf64Bits(); //Gesplitst bestand ophalen (Lijst van BitArrays[64])

            //feistel.setKey(new BitArray(sleutelEen)); //De 16 subsleutels laten genereren
            feistel.setKey(Arrays.ReverseBitArray(new BitArray(sleutels[0])));
            lstCodedFile = new ArrayList(lstSplittedFile.Count); //Fills the list with empty byte arrays

            feedbackInfo(String.Format("Bezig met {0}: DES", strType), true);

    //This function goes on a while with a few occurrences of feedBackInfo(String, bool)

これで、メソッド DoEncrypt が QueueUserWorkItem に追加されるたびに、完全に実行され、すべてが正しく行われます。デバッグ中に、コード ビハインドのメソッド feedbackInfo が正しく呼び出されることに気付きました。

public void setFeedback(String message, bool info)
{
    if (info)
    {
        lblInfo.Text = message;
    }
    else
    {
        lblError.Text = message;
    }
}

ThreadPool 内から feedbackInfo メソッドを 3 回呼び出すと、実際には 3 回呼び出されるため、このメソッドは機能すると思います。両方のラベルの Text プロパティに、以前に割り当てられた値が含まれるたびに。

したがって、唯一の問題は、ラベル テキスト プロパティが変更されるたびにページが変更されないことです。何か案は?

4

1 に答える 1

0

あなたが言及したように、それasp:tableはで囲まれupdate panelているので、あなたの中で、feedbackInfoまたはあなたが更新した場所labelで、メソッドを呼び出しますUpdatePanel.Update

于 2013-11-05T18:48:52.463 に答える