ASP.NET動態生成GridView的使用


根據DataTable動態生成包含checkbox的GridView,其中DataTable中對應checkbox那一列的值必須為bool值。

public static GridView DynamicGenerateColumns(GridView gv, DataTable dt)
        {
            // 把GridView的自動產生列設置為false,否則會出現重復列
            gv.AutoGenerateColumns = false;

            // 清空所有的Columns
            gv.Columns.Clear();

            // 遍歷DataTable 的每個Columns,然后添加到GridView中去
            foreach (DataColumn item in dt.Columns)
            {
                if (item.ColumnName == "選擇")
                {
                    CheckBoxField chCol = new CheckBoxField();
                    chCol.HeaderText = item.ColumnName;
                    chCol.DataField = item.ColumnName;
                    chCol.Visible = true;
                    gv.Columns.Add(chCol);
                    continue;
                }
                BoundField col = new BoundField();
                col.HeaderText = item.ColumnName;
                col.DataField = item.ColumnName;
                col.Visible = true;
                gv.Columns.Add(col);
            }
            return gv;
        }

然后在返回的GridView上綁定dataTable就可以了。還可以添加checkBox點擊事件javascript處理函數。

gridView.DataSource = dataTable;
gridView.DataBind();
for (int i = 0; i < ChargingGridView.Rows.Count; i++)
{
       ((System.Web.UI.WebControls.CheckBox)(gridView.Rows[i].Cells[0].Controls[0])).Attributes.Add("onclick", "OnClickCheck()");
}

在JS函數中對GridView中checkbox的處理,注意下面的Javascript代碼是如何獲取checkbox及其它普通元素的的值。

//該函數實現了根據選擇的checkbox計算某列的值總和的功能
function OnClickCheck() {
    var sumValue=0;
    var gv = document.getElementById("<%=gridView.ClientID%>");
    for (var i = 1; i < gv.rows.length; i++) {
        if (gv.rows[i].cells[0].children[0].checked == false) {
            continue;
        }
        sumValue = sumValue + parseFloat(gv.rows[i].cells[5].innerText);
    }
    document.getElementById('<%=TotalLabel.ClientID%>').innerHTML = sumValue;
}

上面的代碼在后端用C#實現如下,

private void OnClickCheck()
{
    double totalAmount = 0;

    for (int i = 0; i < gridView.Rows.Count; i++)
    {
        if (false == ((System.Web.UI.WebControls.CheckBox)(ChargingGridView.Rows[i].Cells[0].Controls[0])).Checked)
        {
            continue;
        }
        totalAmount += Convert.ToDouble(gridView.Rows[i].Cells[6].Text.Trim());
    }

    TotalLabel.Text = totalAmount.ToString();
}

SQL SERVER中bool的字段類型為bit,如果bool值是從DataTable取出的,則不用修改,如果該列bool值是在select返回的結果上添加的一列固定值,那么就需要在返回的DataTable前添加一列:

dataTable.Columns.Add("選擇", typeof(bool));
dataTable.Columns["選擇"].SetOrdinal(0);
foreach (DataRow dr in ChargeItemDataTable.Rows)
{
       dr["選擇"] = true;//初始化checkbox為選中
}

關於在select返回的結果添加一列固定值,如果添加這一列是字符串或數值類型,那么直接在select語句中即可設置,如select '吳宗憲' as hostName,age from showhosts。但如果是bool值的話,就不能select true as 選擇……,這樣SQL會報錯,要照上面的方法來添加。

現在還有個問題,就是生成的GridView中的checkbox是灰色的,不能操作,也就是enable為false。現在需要綁定GridView_RowDataBound函數,在該函數中設置checkBox的enabled為true。添加該函數過程為:在aspx頁面設計頁中,選中GridView,右邊屬性欄中選擇事件,在下面找到RowDataBound,生成事件處理函數。

protected void gridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
     if (e.Row.Cells[0].GetType() == typeof(System.Web.UI.WebControls.DataControlFieldCell))
     {
           TableCell tc = e.Row.Cells[0];
           if (tc.Controls.Count > 0)
           {
                System.Web.UI.WebControls.CheckBox cb = (System.Web.UI.WebControls.CheckBox)tc.Controls[0];
                if (!(cb == null))
                {
                        cb.Enabled = true;
                }
           }
      }
}

有時候需要把GridView轉換成DataTable:

public static DataTable GetDataTableFromGridView(GridView gv, DataTable dt)
{
    GridViewRow headerRow = gv.HeaderRow;
    int columnCount = headerRow.Cells.Count;
    for (int i = 0; i < columnCount; i++)
    {
        DataColumn dc = dt.Columns.Add();
        dc.ColumnName = headerRow.Cells[i].Text.Trim();
        if ("選擇" == headerRow.Cells[i].Text.Trim())
        {
            dc.DataType = typeof(bool);
        }
        else
        {
            dc.DataType = typeof(string);
        }
    }

    for (int i = 0; i < gv.Rows.Count; i++)
    {
        DataRow dr = dt.NewRow();

        for (int j = 0; j < gv.Columns.Count; j++)
        {
            if ("選擇" == headerRow.Cells[j].Text.Trim())
            {
                if (true == ((System.Web.UI.WebControls.CheckBox)(gv.Rows[i].Cells[j].Controls[0])).Checked)
                {
                    dr[j] = true;
                }
                else
                {
                    dr[j] = false;
                }
            }
            else if (gv.Rows[i].Cells[j].Text.Trim() == "&nbsp;")
            {
                dr[j] = "";
            }
            else
            {
                dr[j] = gv.Rows[i].Cells[j].Text.Trim();
            }
        }

        dt.Rows.Add(dr);
    }
    return dt;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM