コード ビハインド ファイルと、完了までに時間がかかる関数を持つ別のクラスを含む Web サイトがあります。私が望むのは、関数が文字列を渡すときに、訪問者にいくつかの情報を表示することです。
次のように、デリゲートを使用して文字列をコード ビハインドに送り返します。
public event Feedback feedbackInfo;
public EventArgs e = null;
public delegate void Feedback(String message, bool info);
したがって、私の関数FeedbackInfo("message", true);
では、コード ビハインド関数 setFeedback によって受信されるものを使用できます。
public void example() {
new Thread(delegate()
{
crypto = new EncryptNoLibraries(@"C:\Users\Robbie\TestDES\New Microsoft Visio Drawing.vsdx", @"C:\Users\Robbie\TestDES\New Microsoft Visio Drawing encrypted.vsdx");
crypto.feedbackInfo += new EncryptNoLibraries.Feedback(setFeedback);
object[] allArgs = { EncryptNoLibraries.CryptType.ENCRYPT, lstSleutels };
object args = allArgs;
crypto.DoCryptFile(args);
}).Start();
}
public void setFeedback(String message, bool info)
{
if (info)
{
if (!infoCell.Visible)
{
errorCell.Visible = false;
infoCell.Visible = true;
}
lblInfo.Text += String.Format("- {0}<br />", message);
}
else
{
if (!errorCell.Visible)
{
infoCell.Visible = false;
errorCell.Visible = true;
}
lblError.Text += String.Format("- {0}<br />", message);
}
}
これは私のウェブページです:
<%@ Page Title="Home" Async="true" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DESEncryptie._Default" %>
<asp:Content runat="server" ID="FeaturedContent" ContentPlaceHolderID="FeaturedContent">
<script type="text/javascript">
function updater() {
__doPostBack('updatePanel', '');
}
</script>
<section class="featured">
<div class="content-wrapper">
<hgroup class="title">
<h1>DES encryptie/decryptie</h1>
</hgroup>
<p>
Kies simpelweg uw bestand. Vervolgens kiest u uw sleutel en de methode van encryptie of decryptie. Als laatste kiest u de taal waarmee u wilt werken (bijv. Java of .NET).
</p>
</div>
</section>
</asp:Content>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
<h3>Start hier:</h3>
<asp:UpdatePanel ID="updatePanel" runat="server">
<ContentTemplate>
<asp:Table runat="server" CssClass="tableStartHier">
<asp:TableRow>
<asp:TableCell>Bestand:</asp:TableCell>
<asp:TableCell>
<asp:FileUpload ID="bestand" runat="server" on />
<i>(Probleem: bestandsnamen kunnen te lang zijn)</i>
</asp:TableCell>
</asp:TableRow>
<asp:TableRow>
<asp:TableCell><asp:CheckBox ID="DES" runat="server" Checked="true" TextAlign="Left"
Text="DES" OnCheckedChanged="DES_CheckedChanged" AutoPostBack="true" /></asp:TableCell>
<asp:TableCell><asp:CheckBox ID="ThreeDES" runat="server" Checked="false" TextAlign="Left"
Text="3DES" OnCheckedChanged="ThreeDES_CheckedChanged" AutoPostBack="true" /></asp:TableCell>
</asp:TableRow>
<asp:TableRow>
<asp:TableCell ColumnSpan="2">Sleutel:</asp:TableCell>
</asp:TableRow>
<asp:TableRow ID="sleutelDES" runat="server" Visible="true">
<asp:TableCell ColumnSpan="2"><asp:TextBox ID="txtSleutel" runat="server" placeholder="Geef een sleutel" /></asp:TableCell>
</asp:TableRow>
<asp:TableRow ID="sleutelDrieDES1" runat="server" Visible="false">
<asp:TableCell ColumnSpan="2"><asp:TextBox ID="txtSleutel1" runat="server" placeholder="Geef sleutel 1" /></asp:TableCell>
</asp:TableRow>
<asp:TableRow ID="sleutelDrieDES2" runat="server" Visible="false">
<asp:TableCell ColumnSpan="2"><asp:TextBox ID="txtSleutel2" runat="server" placeholder="Geef sleutel 2" /></asp:TableCell>
</asp:TableRow>
<asp:TableRow ID="sleutelDrieDES3" runat="server" Visible="false">
<asp:TableCell ColumnSpan="2"><asp:TextBox ID="txtSleutel3" runat="server" placeholder="Geef sleutel 3" /></asp:TableCell>
</asp:TableRow>
<asp:TableRow>
<asp:TableCell>Taal:</asp:TableCell>
<asp:TableCell>
<asp:DropDownList ID="taal" runat="server" Width="75px">
<asp:ListItem Text=".NET" Value=".NET" />
<asp:ListItem Text=".NET Libraries" Value=".NETLib" />
<asp:ListItem Text="Java Libraries" Value="Java" />
</asp:DropDownList>
</asp:TableCell>
</asp:TableRow>
<asp:TableRow>
<asp:TableCell><asp:Button id="encrypteer" Text="Encrypteer" runat="server" OnClientClick="setInterval(updater, 2500);" 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>
<asp:TableCell runat="server" ID="spinner" Visible="false">
<asp:Image ID="imgSpinner" runat="server" ImageUrl="~/Images/spinner.gif"/>Even geduld.
</asp:TableCell>
</asp:TableRow>
<asp:TableRow ForeColor="Blue">
<asp:TableCell ID="infoCell" runat="server" ColumnSpan="2" Visible="false">
Informatieberichten tijdens het crypteren:<br />
<asp:Label ID="lblInfo" runat="server" Text="" />
</asp:TableCell>
</asp:TableRow>
<asp:TableRow ForeColor="Red">
<asp:TableCell ID="errorCell" runat="server" ColumnSpan="2" Visible="false">
Foutberichten tijdens het crypteren:<br />
<asp:Label ID="lblError" runat="server" Text="" />
</asp:TableCell>
</asp:TableRow>
</asp:Table>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
You can see I use a javascript to update my panel by postback every 2.5 seconds. The problem is that when the postback is triggered, the text in the label that should be update is lost. Here are some images to illustrate. Before is how the page looks at first render and after is what is displayed after I push the encrypt button. Not all messages are displayed even after 2.5 seconds (they even disappear!).
Before:
After:
What am I doing wrong?