利用FindControl 一次清除,頁面選單輸入的文字 。
前兩天,USER反應說...XX資料輸入頁面跟查詢頁面組合在一起,在輸入與查找要不停的使用滑鼠滾輪上上下下很麻煩,可不可以調整??
我:【那查詢跟輸入頁面切開,若要是輸入錯誤,再到查詢頁面去修正,可以嗎??】
USER:【反正我只是不想用滑鼠滾輪上下,你怎麼做怎麼快,就怎麼做吧!!!】
最後決定,直接將輸入資料區塊加上PANEL,然後使用者在按下查詢時,會將輸入資料區塊屏蔽,只留下查詢結果與修正畫面.....(只花10分鐘修改+部署)
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<div id="div1" runat="server">
<asp:Panel ID="Panel1" runat="server"> <!-- 加上Panel -->
<table>
<tr>
<td style="width: 120px; height: 30px;">進出貨別:</td>
<td>
<asp:DropDownList ID="ddl1" runat="server"></asp:DropDownList>
</td>
<td >
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</td>
</tr>
</table>
</asp:panel>
</div>
</asp:Content>
當天下午USER就反應:【新增資料儲存後,舊資料不會清空。影響輸入】
......這就是程式寫好沒有測試的下場....覺得很簡單......可以不用驗證,不用跑測試....就出包了.......
原先清除資料的寫法:
private void CleantText()
{
string cleanTextbox = "ctl00$ContentPlaceHolder1$div1";//網頁載入的控制項的名稱。
foreach (Control cc in this.Page.FindControl(cleanTextbox).Controls)
{
if (cc is TextBox)
{
((TextBox)cc ).Text = string.Empty;
}
if (cc is DropDownList)
{
((DropDownList)cc ).SelectedIndex = 0;
}
}
}
執行查找了一次後發現,程式沒有找到TextBox跟DropDownList的控制項........(平白消失了??)
在一篇文章中找到了相關的說法,原來是當我們將Panel添加到頁面,Panel的就會成為HtmlForm的子控制項,可以在HtmlForm找到Panel控制項。
但是,如果將一個TextBox控制項加到Panel中,在HtmlForm中會找不到TextBox控制項,因為TextBox控制項不是該頁面的子控制項
所以要找到TextBox控制項,應該需要先找到Panel控制項後,在從Panel控制項找到TextBox控制項。更實際的應用應該是創建一個遞迴方法,可以呼叫它來處理每個控件的Controls集合。
簡單的說:就是原本的控制項的架構是HtmlForm(父)、TextBox(子)
加上了Panel後,變成了 HtmlForm(父)、Panel(子)、TextBox(孫)
所以當然就找不到該清除資料的控制項.....................................應該要到第三層去查找。
程式變更如下:
private void CleantText()
{
string cleanTextbox = "ctl00$ContentPlaceHolder1$div1";//網頁載入的控制項的名稱。
foreach (Control cc in this.Page.FindControl(cleanTextbox).Controls)
{
foreach (Control dd in cc.Controls)
{
if (cc is TextBox)
{
((TextBox)dd).Text = string.Empty;
}
if (cc is DropDownList)
{
((DropDownList)dd).SelectedIndex = 0;
}
}
}
}
測試後正常.......上線......(收工)
後記:其實應該是改成,直接進入查詢頁面,要新增時點選【新增資料】按鈕後,將頁面所有欄位顯示為空白,等待輸入資料。
水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。