在绑定源时检查/取消选中gridview中的复选框

时间:2014-03-05 07:37:55

标签: c# mysql asp.net gridview

我正在开发一个项目。我有一个gridview,其中一列有复选框。现在我想用数据填充gridview并根据我的状态字段检查/取消选中复选框。现在我正在gridview行中处理它数据绑定事件。但我只是想知道在绑定源时有没有办法标记复选框。

我正在执行查询以获取gridview中的数据

select s.studentcode,s.studentname,r.status from tblstudent s join tblresults r on s.studentcode=r.studentcode

输出我正在

enter image description here

现在我希望如果我的状态为'已提升'复选框已选中,如果未被提升,则复选框将取消选中。我不想使用行数据绑定方法。我希望我的工作在以下行中完成< / p>

 sql = "select s.studentcode,s.studentname,r.status from tblstudent s join tblresults r on s.studentcode=r.studentcode";
    ds = obj.openDataset(sql, Session["SchoolCode"].ToString());
    if (ds.Tables[0].Rows.Count > 0)
    {
        grdstudents.DataSource = ds;
        grdstudents.DataBind();
        grdstudents.Visible = true;
    }
    else
    {
        alertdiv.Visible = true;
        lblalertmsg.Visible = true;
        btnclose.Visible = true;
        lblalertmsg.Text = "No Record found";
    }

解决方案

查询

select s.studentcode,s.studentname,if(r.status='Promoted',true,false) as status from tblstudent s left join tblresults r on s.studentcode=r.studentcode where s.classcode='10000'

grdstudents.DataSource = ds;// note we binded to final table
grdstudents.DataBind();

gridview中的aspx页面中的复选框字段:

<ItemTemplate>
               <asp:CheckBox ID="chkapply" runat="server" Checked='<%# Convert.ToBoolean(Eval("status"))%>'/>
           </ItemTemplate>

此解决方案将帮助您避免在使用gridview的迭代绑定或行数据绑定事件时编写额外的代码

2 个答案:

答案 0 :(得分:2)

您需要为网格使用OnItemDataBoundEvent。 如果您不想使用该事件。然后你可以循环遍历gridview的所有行。

如果您的网格ID为grid1,则循环遍历grid1.Rows中的所有行。 您必须在行中找到您的复选框,然后根据您的数据选中/取消选中它。

foreach (GridViewRow row in grid1.Rows)
{
   CheckBox checkBox1 = row.FindControl("checkBox1") as CheckBox;
   checkBox1.Checked = true; // based on condition

}

答案 1 :(得分:2)

只能使用布尔值检查/取消选中复选框。在这种情况下,因为列:&#39;状态&#39;不代表布尔值,因此直接绑定数据不会达到目的。

您需要执行以下两个步骤:

第1步。)将原始数据复制到新表格中,然后更改“状态”的数据类型&#39;列到布尔值。

第2步。)使用原始表的数据修改最终表中状态列中的数据。

第1步:

ds = obj.openDataset(sql, Session["SchoolCode"].ToString());
DataTable dtOriginalTable = ds.Tables[0];
DataTable dtFinalTable = new DataTable();
foreach (DataColumn dc in dtOriginalTable.Columns)
{
dtFinalTable.Columns.Add(dc.ColumnName);
}
foreach (DataColumn dc in dtFinalTable.Columns)
{
           if (dc.ColumnName == "status")
               dc.DataType = System.Type.GetType("System.Boolean");
}

下面的第2步::

foreach (DataRow drow in dtOriginalTable.Rows)
{
         if( drow["status"].ToString().Equals("Promoted"))
              drow["status"]="true";
         else
              drow["status"]="false"
// ADD the row to final table 
dtFinalTable.Rows.Add(drow.ItemArray);
}

现在将您的GridView绑定为:

grdstudents.DataSource = dtFinalTable ;// note we binded to final table
grdstudents.DataBind();

注意:: 为什么需要第1步?因为一旦填充了数据,就无法更改列的数据类型。

当数据库包含大量数据时,这也是一个性能问题。