2021年1月14日 星期四

[研究][ASP.NET]檢查FormView1中上百個TextBox輸入資料長度

[研究][ASP.NET]檢查FormView1中所有TextBox輸入資料長度

2021-01-14
2021-01-15更新

Visual Studio 2019 + ASP.NET + WebForm + C#

因為有上百個 TextBox 要檢查,所以逐個 FindControl 取出檢測太累。

protected void FormView1_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
    // 檢查所有 TextBox 是否內容長度超過 255,避免 SQL Server 吐 Error
    string errMsg = CheckAllTextBoxeLength(FormView1);

    if (errMsg != "")
    {
        e.Cancel = true;
        Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('" + errMsg + "');</script>");
    }
}
private string CheckAllTextBoxeLength(Control parent)
{
    string errMsg = "";
    foreach (Control c in parent.Controls)
    {
        if (c.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
        {
            TextBox tbox = c as TextBox;
            if (tbox != null)
            {
                if (tbox.Text.Length >= 255)
                {
                    errMsg = errMsg + "「" +  tbox.Text + "」填寫內容長度超過255字元。";
                }
            }
        }
        if (c.Controls.Count > 0)
        {
            errMsg = errMsg + CheckAllTextBoxeLength(c);
        }
    }
    return errMsg;
}        

********************************************************************************

2021-01-15 更新,更簡潔做法

protected void FormView1_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
    // 檢查所有 TextBox 是否內容長度超過 255,避免 SQL Server 吐 Error
    // 字串或二進位資料會被截斷。陳述式已經結束。
    string errMsg = "";

    for (int i = 0; i < e.NewValues.Count ; i++)
    {
        if (e.NewValues[i] != null)
        {
            if (e.NewValues[i].ToString().Length >= 255)
            {
                errMsg = "「" + e.NewValues[i].ToString() + "」內容超過 255 字元。";
                break;
            }
        }
    }
    if (errMsg != "")
    {
        e.Cancel = true;
        Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('" + errMsg + "');</script>");
    }
}


再省時間,略過 RadioButton 和 CheckBox 不要查

protected void FormView1_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
    // 檢查所有 TextBox 是否內容長度超過 255,避免 SQL Server 吐 Error
    // 字串或二進位資料會被截斷。陳述式已經結束。
    string errMsg = "";

    for (int i = 0; i < e.NewValues.Count ; i++)
    {
        if (e.NewValues[i] != null)
        {
            // 只要是 TextBox 輸入的都是 String,RadioButton 和 CheckBox 輸入的是 Boolean
            // if (e.NewValues[i].GetType().FullName == "System.String")
            if (e.NewValues[i].GetType().Name == "String")
            { 
                if (e.NewValues[i].ToString().Length >= 255)
                {
                    errMsg = "「" + e.NewValues[i].ToString() + "」內容超過 255 字元。";
                    break;
                }
            }
        }
    }
    if (errMsg != "")
    {
        e.Cancel = true;
        Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('" + errMsg + "');</script>");
    }
}


再精簡

// 暫存,基本檢查
// 檢查所有 TextBox 是否內容長度超過 255,避免 SQL Server 吐 Error
// 字串或二進位資料會被截斷。陳述式已經結束。
foreach (System.Collections.DictionaryEntry entry in e.NewValues)
{
    var k = entry.Key;
    var v = entry.Value;    // TextBox 就算沒填寫,也是 "",不會 null;RadioButton 或 CheckBox 是 true 或 false;
    if (v.ToString().Length >= 255)
    {
        errMsg = "「" + v.ToString() + "」內容超過 255 字元。";
        break;
    }
}


再強化。

protected void FormView1_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
    string errMsg = "";

    // 暫存,基本檢查
    // 檢查所有 TextBox 是否內容長度超過 255,避免 SQL Server 吐 Error
    // 字串或二進位資料會被截斷。陳述式已經結束。
    foreach (System.Collections.DictionaryEntry entry in e.NewValues)
    {
        var k = entry.Key;
        var v = entry.Value;    // TextBox 就算沒填寫,也是 "",不會 null;RadioButton 或 CheckBox 是 true 或 false;
        if (v.ToString().Length >= 255)
        {
            errMsg = "「" + v.ToString() + "」內容超過 255 字元。";
            break;
        }
        // 敝人輸入數字用的 TextBox,SQL Server 資料庫欄位取名都包含 Int ,Bind() 的名稱包含 Int 字串
        if (k.ToString().Contains("Int"))
        {
            bool convertOK =  Int32.TryParse(v.ToString(), out int vInt);
            if (convertOK == false)
            {
                errMsg = "「" + v.ToString() + "」轉換失敗,應該輸入整數數字。";
            }
            if (v.ToString() != vInt.ToString())
            {
                errMsg = "「" + v.ToString() + "」應該輸入整數數字。";
            }
        }
    }
    if (errMsg != "")
    {
        e.Cancel = true;
        Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('" + errMsg + "');</script>");
    }
}

(完)

沒有留言:

張貼留言