[C#][ASP.NET] 利用控制項 Control.FindControl 清除頁面選單輸入的文字,加入Panel後失效...

利用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;
                }
            }
        }
    }

測試後正常.......上線......(收工)

 

後記:其實應該是改成,直接進入查詢頁面,要新增時點選【新增資料】按鈕後,將頁面所有欄位顯示為空白,等待輸入資料。

 

水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。