0
所以我想在後臺代碼中運行的線程中更新我的TextBox,名爲「ServerDataArea」。asp.net textbox不更新後面的表格代碼
形式:
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox id="ServerDataArea" TextMode="multiline" Columns="50" Rows="15" runat="server" Enabled="false" />
<br />
<asp:TextBox ID="Message" runat="server" ></asp:TextBox>
<asp:Button ID="SendMessage" runat="server" OnClick="appendMessage_Click" Text="Send" />
</ContentTemplate>
</asp:UpdatePanel>
這是我的代碼後面怎麼做更新這個文本框:
public delegate void MyDelegate(string text);
private MyDelegate d;
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
d = new MyDelegate(MyMethod);
}
// create connection
// ...
// create thread
if(Session["thread"] == null)
{
Session["thread"] = new Thread(new ThreadStart(RunReceiver));
}
Thread receiverThread = (Thread)Session["thread"];
if (!receiverThread.IsAlive)
{
receiverThread.Start();
Debug.WriteLine("Receiver thread started!");
}
}
/// <summary>
/// receive messages from the server
/// </summary>
private void RunReceiver()
{
byte[] data = null;
while (con.GetClient().Connected)
{
// if stream contains data to recieve
if (con.GetStream().DataAvailable)
{
Debug.WriteLine("client receiving some data");
// create new buffer to store received data
data = new Byte[256];
// read data from stream
Int32 bytes = con.GetStream().Read(data, 0, data.Length);
// convert to readable text
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
// display message in chat
d(responseData);
}
Thread.Sleep(400);
}
}
private void MyMethod(string text)
{
ServerDataArea.Text += text + "\r\n";
}
中的Debug.WriteLine(ServerDataArea.Text)確實告訴我什麼應該是在可見文本框,但它是不可見的,我只是不知道如何使其可見..
答覆謝謝,我更換了啓用=「假」只讀=」真「,因爲默認Enabled = true,但我得到相同的結果,文本框仍然是空白的。 – jt123
說實話,在黑暗中有點刺,真正的問題是與你的線程有關,也就是說你的代碼在UI線程中運行在一個單獨的線程上,UI將只允許通過UI線程。 –
好吧,所以我更新了代碼,向您展示瞭如何在添加委託時執行相應的代碼,但是我得到的結果相同,因此我必須在那裏做錯了什麼? – jt123