2014-03-05 92 views
1

我正在一個項目上工作。我有一個gridview有一列有checkbox.Now我想用數據填充我的GridView並根據我的狀態字段檢查/取消選中相應的複選框。直到現在我正在處理gridview行數據綁定event.But,但我只想知道是否有任何方法來標記複選框,而綁定源。檢查/取消選中GridView綁定源中的複選框

查詢我正在執行以獲得gridview的數據

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

輸出我得到

enter image description here

現在我想,如果我的狀態是「促進」複選框接受檢查,如果是'不推廣'複選框得到unchecked.I不想要使用行數據綁定方法。只想要我的工作在下面的行完成

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"; 
    } 
在aspx頁面裏面的GridView

解決方案

查詢

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(); 

複選框字段:

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

該解決方案將幫助您避免額外的代碼,以便在使用itembinding或行的數據綁定寫入gridview事件

回答

2

只有使用布爾值才能選中/取消選中複選框。在這種情況下,因爲Column:'status'不表示布爾值,所以直接綁定數據不會達到目的。

您需要按照兩個步驟:

步驟1)複製原數據到新表,並更改您的「狀態」一欄布爾的數據類型。

第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是必需的?因爲一旦填充了數據,就無法更改列的數據類型。

此外,當數據庫有大量數據時,這將是一個性能問題。

+1

但是如何將複選框綁定到狀態字段 rupinder18

+0

您應該使用「Checked」屬性:'runat =「server」/>或者試試看:Checked ='<%#Convert.ToBoolean Eval(「Column_Name_Here」))%>' –

+0

ya it worked thanx – rupinder18

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 

} 
+0

但我不想使用任何event.Is有可能直接做 – rupinder18

+0

@ rupinder18我已經更新了我的答案。 – AbhinavRanjan

相關問題