![]() ![]() ![]() ![]() |
|||||
|
|||||
樓主 芝麻泡芙 ![]()
![]() |
請各位大大幫我看一下哪裡有問題,謝謝! 程式碼如下: DataSet DS = new DataSet(); Literal Lter = new Literal(); protected void Page_Load(object sender, EventArgs e) { } protected void BT_SearchData_Click(object sender, EventArgs e) { string query = @" SELECT * FROM Detail WHERE (Date like '%'+ @Keyword +'%') OR (Name like '%'+ @Keyword +'%') Order by Date "; using (SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["ProblemReport_TableLink"].ConnectionString)) { SqlDataAdapter da = new SqlDataAdapter(query, conn); da.SelectCommand.Parameters.AddWithValue("@Keyword", this.TB_Search.Value.ToString()); da.Fill(DS, "DetailA"); if (DS.Tables["DetailA"].Rows.Count == 0) { Response.Write("<Script language='JavaScript'>alert('搜尋後無資料,請重新搜尋!\\n');</Script>"); this.BT_Export.Visible = false; } else if (DS.Tables["DetailA"].Rows.Count > 0) { Lter.Text = "<table >"; Lter.Text += "<tbody>"; for (int i = 0; i <= DS.Tables["DetailA"].Rows.Count - 1; i++) { Lter.Text += "<tr>"; for (int j = 0; j <= DS.Tables["DetailA"].Columns.Count - 1; j++) { Lter.Text += "<td>" + DS.Tables["DetailA"].Rows[i][j].ToString() + "</td>"; } Lter.Text += "</tr>"; } Lter.Text += "</tbody></table>"; this.ShowTable.Controls.Add(Lter); } } } protected void BT_Export_Click(object sender, EventArgs e) { DataTable dt, dt2 = new DataTable(); dt = DS.Tables["DetailA"]; dt2 = DS.Tables["DetailB"]; if (dt.Rows.Count == 0) { Response.Write("<Script language='JavaScript'>alert('0!\\n');</Script>"); } else { Response.Write("<Script language='JavaScript'>alert('Have Data!\\n');</Script>"); } } |
別忘捐VP感謝幫助你的人 | 新手會員瞧一瞧 |
1樓 |
我沒有親自執行,只看了您的程式碼。
我猜:BT_Export_Click事件底下的 dt 的確是空的啊 有哪一列程式把 "數據" 餵給它嗎?
本篇文章回覆於2018-11-27 20:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
2樓
作者回應
芝麻泡芙 ![]() |
我在BT_SearchData_Click 用SqlDataAdapter把資料塞到DetailA 裡面 --> da.Fill(DS,"DetailA");,
DataSet DS = new DataSet(); 放在BT_SearchData_Click 和 BT_Export_Click 外面。 並且有執行SearchData之後才可以執行Export的部分. 在BT_SearchData_Click 裡 if (DS.Tables["DetailA"].Rows.Count == 0)可以進行判斷,用this.ShowTable.Controls.Add(Lter); 在網頁上確實有顯示資料出來。 但是在 BT_Export_Click 裡 if (DS.Tables["DetailA"].Rows.Count == 0)在這一行出現"並未將物件參考設定為物件的執行個體"錯誤
本篇文章回覆於2018-11-28 09:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
3樓
不錯的參考
MIS2000 Lab ![]() |
各自的兩個事件
只因為你的變數名稱(dt)相同,就能共用資訊嗎? 再想想 :-) 另外,網頁程式 Http是一種「沒有狀態(stateless)」的協定 您的寫法,或許在 Windows Form上OK 但網頁上就不行
本篇文章回覆於2018-11-28 09:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
4樓
最有價值解答
topcat ![]() ![]() |
這是蠻標準的頁面生命週期迷思
A.我以為程式只要執行過,把資料放到公用變數,下次執行裡面就會有資料 B.ASP.NET每一次PostBack後,都會重新執行一次程式 C.Web的應用系統,預設是沒有狀態的(沒有保留上一次執行的結果,每次都是新的) 要保留狀態,應該用適當的機制進行保留,例如:Session, ViewState, Cookie, ... 說明為什麼 從您的程式來看,應該會這樣執行 1.初次載入頁面 會觸發『Page_Load』 2.按下『BT_SearchData』按鈕,取得資料。會觸發『Page_Load, BT_SearchData_Click()』 3.按下『BT_Export』按鈕,要對資料處理。會觸發『Page_Load, BT_Export_Click()』 2.的確會取得資料 3.的時候∼ 還記得嗎?沒有狀態保留∼ 所以重新執行時,沒有經過『BT_SearchData_Click()』,取得資料 因此去觸發『BT_Export_Click()』當然就『連物件都沒有』 自然就是『並未將物件參考設定為物件的執行個體"』這個錯誤 --- 解決方式 小喵建議 把讀取資料抽出,放在一個function中 ,假設叫做getData() BT_SearchData_Click() 去執行getData() BT_Export_Click() 先執行一次getData() 再執行原本裡面的東西 醬子就可以了 ^_^
本篇文章回覆於2018-11-28 09:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
5樓 |
題外話,但很重要
請『不要』用Response.Write去動態注入JavaScript 如果您去瀏覽器檢視原始碼,看看您這樣做,他的程式碼生成在哪 您就知道,其實這樣的html內容其實是不太對∼ 怎麼做才對 建議您仔細看這一篇 https://dotblogs.com.tw/hatelove/archive/2009/10/28/11325.aspx ^_^
本篇文章回覆於2018-11-28 09:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
6樓
作者回應
芝麻泡芙 ![]() |
問題解決了! 使用 topcat 提供的解決方法。
感謝 MIS2000 Lab 與 topcat 提供想法與引導,並指出其他應修改的地方。 謝謝! ^-^
本篇文章回覆於2018-11-28 11:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
回覆 |
如要回應,請先登入. |