2014年2月20日 星期四

[ASP.NET]如何抓取大型控制項中每列資料的內容

最近想寫一個程式當作自我測驗的工具

利用GridView撈出資料庫的資料當題目

然後在每一列設一行TextBox作為輸入

答案行則預設Visible=false隱藏答案

最後填完後按下外部button檢查全部TextBox跟答案是否相同

當然這不是一種好的設計方式

因為使用者可以用看網頁原始碼的方式看到答案

有人提供比較好的解決方式是把出入的內容去跟資料庫裡面的內容做比較

不過這個程式只有我自己會用到所以暫時沒這問題


其中有遇到一個問題

我要怎麼用外部button讓每列的資料進行比較?

如果是在資料繫結階段結束後GridView會觸發rowDataBound()事件

ListView則是觸發itemDataBound()事件

都可以在這些事件中抓取網頁中的資料進行比對

但現在資料都已經在頁面上我要怎麼「主動」讓每列重新作出類似itemDataBound()的動作

後來看了人家的意見發現自己有點想太多了

就直接用迴圈去撈每列資料不就好了(是的,其實很簡單,我在想啥Orz)

最後用ListView解法如下

protected void Button1_Click(object sender, EventArgs e)
{
    for (int i = 0; i < ListView1.Items.Count; i++)
    {
        TextBox tb = ListView1.Items[i].FindControl("TextBox1") as TextBox;
        HtmlTableCell ans = ListView1.Items[i].FindControl("answer") as HtmlTableCell;
        if (ans != null)
        {
            if (tb.Text.Trim().Equals(ans.InnerHtml.Trim()))
            {
                Response.Write("答對<br>");
            }
            else
            {
                Response.Write("答錯<br>");
            }
        }
    }
}

ListView有items GridView有rows

都能取得整個資料的集合

所以只要用陣列的方式讀出每一列再用FindControl()就能抓到你要的資料了

沒有留言:

張貼留言