作者Anthony53 (安東尼)
看板C_Sharp
標題[問題] 動態更新Label值
時間Mon Feb 10 10:59:15 2014
如果我從DB中撈資料
撈完資料後要立即更新Lable值
之後每30秒會撈一次資料
我想要在撈完資料後立即更新Label值
我嘗試用Timer
但他只能控制時間
可是我希望是在我做完這個動作後的下一行更新Label值
而不是每30秒更新值
我也試過委派了
可是都不行 請問還有甚麼辦法嗎 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.109.6.129
1F:→ a926:?? Timer每30秒觸發事件後->DB撈資料->更新Label值 02/10 11:06
2F:→ a926:是你的流程有問題嗎? 02/10 11:06
我是在前端寫個timer 設定每1秒撈資料
但他第一次撈資料 他會亂跳
第一次通常會在等100秒或20或30更新一次Label
之後就會固定每一秒撈資料
可是第一次撈資料的時間會不固定 之後就會很正常
不知道為什麼會這樣 謝謝
※ 編輯: Anthony53 來自: 140.109.6.129 (02/10 11:18)
3F:→ KanoLoa:更新label.text 之後,多一行label.update看看 02/10 13:23
4F:→ KanoLoa:你第一次撈資料的時候有確定連接到資料庫了嗎 02/10 13:24
5F:→ Litfal:是DB端有問題還是UI端有問題?所以說要把物件職責拆開阿... 02/10 13:25
6F:→ Litfal:至少把DbContext和UI分開,改用事件通知來寫。 02/10 13:27
我貼一下部分的程式碼
我確定值有存到A裡面 只是他沒有顯示到前端
我希望他可以動態顯示到前端
Button2_Click1(object sender, EventArgs e)
{
while{
//////撈資料到string A/////
A=撈出的資料;
}
}
protected void Timer1_Tick(object sender, EventArgs e)
{
Label1.Text = A;
}
※ 編輯: Anthony53 來自: 140.109.6.129 (02/10 13:43)
7F:推 johnpage:timer使用有問題 02/10 15:07
請問哪邊出了問題 謝謝
※ 編輯: Anthony53 來自: 140.109.6.129 (02/10 18:54)
8F:→ Litfal:A到底是string還是Control...怎麼會有A.Text 02/10 19:04
9F:→ Litfal:而且你這Timer也沒有重新撈資料阿 02/10 19:05
A是string 抱歉我打錯
Timer我設定每5秒會重新更新
A的值會隨著每次while做完就會更新
A我宣告在global
所以我這樣寫會產生問題嗎 還麻煩幫忙指證 謝謝!
※ 編輯: Anthony53 來自: 140.109.6.129 (02/10 19:15)
10F:→ KanoLoa:會,撈資料太慢配上你的timer邏輯可能會卡到沒更新畫面 02/11 00:25
11F:→ KanoLoa:先試試看把label那行丟在button2事件最後一行測試正確 02/11 00:26
12F:→ KanoLoa:不過這種寫法不好,別在UI事件中放可能會讀取很久的邏輯 02/11 00:26
我有測試過 值是正確的 可是沒辦法動態更新畫面 值只會在server端
可以請教一下 如果這樣的處理 該用甚麼方式比較好呢 謝謝
※ 編輯: Anthony53 來自: 140.109.6.129 (02/11 09:17)
※ 編輯: Anthony53 來自: 140.109.6.129 (02/11 09:22)
13F:→ KanoLoa:額外開一個新的執行序去撈資料 02/11 10:14
14F:→ KanoLoa:UI更新畫面會等你事件全處理好才一次更新,自然會跳過 02/11 10:16
我把我的問題簡化
static int i=0;
protected void Timer1_Tick(object sender, EventArgs e)
{
Label1.Text = i;
}
protected void Button1_Click(object sender, EventArgs e)
{
while (true)
{
i++;
}
}
我希望看到 按下button後 會看到 0123456789....
可是我這樣寫 會只看到0就停住了 大概過了若干秒 才會出現0123456789...
※ 編輯: Anthony53 來自: 140.109.6.129 (02/11 12:21)
15F:→ m339606:AJAX + AJAX Timer 02/11 12:27
16F:→ KanoLoa:因為整個事件要等你迴圈跑完才更新畫面阿,當然會延遲。 02/11 13:01
17F:→ KanoLoa:創一個執行緒去額外跑回圈,會稍微好一點 02/11 13:02
那如果我這種做法 要怎麼寫會比較適合 謝謝
※ 編輯: Anthony53 來自: 140.109.6.129 (02/11 13:59)
我這限制要用web form才可以
※ 編輯: Anthony53 來自: 140.109.6.129 (02/11 17:12)
void A(){
回圈
{
抓資料
呼叫B
}
}
void B(){
將資料印到client
跳到A迴圈剛剛呼叫B的地方
}
我在簡化成這樣...不知道有沒有比較清楚 謝謝
※ 編輯: Anthony53 來自: 140.109.6.129 (02/11 17:16)
19F:→ KanoLoa:鬼打牆了,請開另一個執行續跑回圈,迴圈速度慢點即可。 02/11 18:03
20F:→ KanoLoa:你知道更新畫面的函示是哪個嗎? 02/11 18:04
21F:→ Litfal:你都用Timer了何必用迴圈哩...? 02/11 18:33
22F:→ KanoLoa:乾脆全貼吧 02/11 18:57
23F:推 largesperm:用 backgroundworker 02/11 20:28
我用的是web form
Code:
static int i=1;
static string T="";
protected void Timer1_Tick(object sender, EventArgs e)
{
////T為excel取出來的值///
Label1.Text = T;
}
protected void Button1_Click(object sender, EventArgs e)
{
while (i<1000)
{
////從excel取出T值///
i++;
}
}
原始碼大概長這樣 每3秒會取出T值 所以我設定Timer每3秒更新一次
但現在我這樣寫 前面2分鐘被while迴圈給block Timer完全執行不了
過約兩分鐘後 就會變成Timer和while兩個輪流用
大概是這樣 謝謝
※ 編輯: Anthony53 來自: 61.228.161.249 (02/11 21:00)
※ 編輯: Anthony53 來自: 61.228.161.249 (02/11 21:00)
24F:→ KanoLoa:捨棄你的迴圈吧,另開一個timer慢慢+++++會比較容易理解 02/11 23:20
恩 可以請教一下
如果我再開另一個timer 我該怎麼控制從excel取值得timer做完取值的動作後
在呼叫另一個timer去client印出值
然後再跳回去取值呢
這是我一直卡住的地方 謝謝
※ 編輯: Anthony53 來自: 61.228.161.249 (02/11 23:31)
25F:→ Litfal:回去重讀Timer!上面就想推薦用System.Threading底下的Timer 02/12 00:32
→ Litfal:但想到要解釋我就軟了...
我早上有用 可是沒有產生效果
http://ppt.cc/lcg1 我參考msdn
26F:→ KanoLoa:用一個timer一直檢查數值是否有變動來決定要不要更新 02/12 01:01
我早上試過
就是timer一開始都搶不到cpu 雖然我設定了5秒要印出值
可是它會搶不到cpu所以就沒辦法印出值
※ 編輯: Anthony53 來自: 140.109.6.129 (02/12 09:29)
27F:→ KanoLoa:迴圈要拿掉!然後不要一直撈資料,不然都卡在那邊 02/12 09:32