2011-12-10 125 views
0

我需要设置这些GridView以供管理员更新。因此,由于我在每个GridView中都有很多员工和很多课程,所以我认为最好的 更新GridView的方式是将空白字段显示为复选框,并且管理员想要更新其中一个记录的时间为 员工,他所需要做的只是检查复选框并单击更新按钮。 我可以 能够显示空字段作为复选框,但现在我不知道如何 张贴检查复选框到数据库的值。如何在选中复选框并单击保存按钮后更新GridView?

,我寻找它是使系统检查每个 复选框中的每个GridView控件,如果已经检查之前,离开它,因为它是 的情景。如果它是空的并且现在只检查它,则应将其添加到员工记录中的 数据库中。因此,GridView将通过单击保存按钮进行更新。我原来的代码是:

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1"> 
      <ItemTemplate> 

       <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("GroupID")%>' /> 

       <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
            SelectCommandType="StoredProcedure" SelectCommand="kbiReport"> 
            <%--FilterExpression="[Division] like '{0}%' and [Organization] like '{1}%'">--%> 

        <%--<FilterParameters> 
         <asp:ControlParameter ControlID="ddlDivision" Name="Division" 
               PropertyName="SelectedValue" Type="String" /> 
         <asp:ControlParameter ControlID="ddlOrganization" Name="Organization" 
               PropertyName="SelectedValue" Type="String" /> 
        </FilterParameters>--%> 

        <SelectParameters> 
         <%--ControlParameter is linked to the HiddenField above to generate different GridView based on different values 
          of GroupID--%> 
         <asp:ControlParameter ControlID="HiddenField1" Name="GroupID" PropertyName="Value" /> 
        </SelectParameters> 
       </asp:SqlDataSource> 

       <asp:GridView ID="GridView1" runat="server" 
           AllowSorting="True" 
           CellPadding="3" 
           DataSourceID="SqlDataSource1" 
           CssClass="mGrid" 
           AlternatingRowStyle-CssClass="alt" 
           RowStyle-HorizontalAlign="Center" 
           OnRowDataBound="GridView1_RowDataBound" OnDataBound="GridView1_DataBound"> 
        <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> 
        <HeaderStyle Font-Bold = "true" ForeColor="Black"/> 
        <Columns> 
         <asp:CommandField ShowSelectButton="True" /> 

         <%--<asp:TemplateField HeaderText="Select"> 
         <ItemTemplate> 
         <asp:CheckBox ID="chkSelect" runat="server" AutoPostBack="true" OnCheckedChanged="chkSelect_CheckedChanged"/> 
         </ItemTemplate> 
         </asp:TemplateField>--%> 
        </Columns> 
        <EditRowStyle BackColor="#999999" /> 
        <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
        <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> 
        <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
        <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> 
        <SortedAscendingCellStyle BackColor="#E9E7E2" /> 
        <SortedAscendingHeaderStyle BackColor="#506C8C" /> 
        <SortedDescendingCellStyle BackColor="#FFFDF8" /> 
        <SortedDescendingHeaderStyle BackColor="#6F8DAE" /> 
       </asp:GridView> 

      </ItemTemplate> 
     </asp:Repeater> 

     <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
          ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
          SelectCommand="SELECT DISTINCT GroupID FROM courses"> 
     </asp:SqlDataSource> 

     <asp:Button ID="btnSave" runat="server" OnClick="btnSave_Click" Text="Save" /> 
     <br /><br /> 

隐藏代码:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      foreach (TableCell c in e.Row.Cells) 
      { 
       // Check if the cell vlaue = Yes 
       // if it is Yes, the cell will be colored with Light Green 
       if (c.Text.Equals("Yes")) 
       { 
        c.BackColor = System.Drawing.Color.LightGreen; 
       } 
      }  
     } 

     // The following is for changing the color of headers in each GridView based on the value of the HiddenFild 
     // BTW, the value of the HiddenField is the value of the GroupID in Group Table in the Database 
     else if(e.Row.RowType == DataControlRowType.Header){ 
      switch (((HiddenField)((GridView)sender).Parent.FindControl("HiddenField1")).Value) 
      { 
       case "1": 
        for (int i = 5; i &lt; e.Row.Cells.Count; i++) 
         e.Row.Cells[i].BackColor = System.Drawing.Color.LightBlue; 
        break; 

       case "2": 
        for (int i = 5; i &lt; e.Row.Cells.Count; i++) 
         e.Row.Cells[i].BackColor = System.Drawing.Color.LightYellow; 
        break; 

       case "3": 
        for (int i = 5; i &lt; e.Row.Cells.Count; i++) 
         e.Row.Cells[i].BackColor = System.Drawing.Color.Orange; 
        break; 
      } 
     }} 


     //For inserting checkboxes inside all courses buttons 
     protected void GridView1_DataBound(object sender, EventArgs e){ 
      GridView GridView1 = (GridView)sender; 
      foreach (GridViewRow objRow in GridView1.Rows) 
      { 
       for (int i = 5; i &lt; objRow.Cells.Count; i++){ 
        CheckBox chkCheckBox = new CheckBox(); 
        objRow.Cells[i].Controls.Add(chkCheckBox); 
        if (objRow.Cells[i].BackColor == System.Drawing.Color.LightGreen) 
         chkCheckBox.Checked = true; 
       } 

      } 
     } 


     //For updating the GridView (Save Button) 
     protected void btnSave_Click(object sender, EventArgs e) 
     { 

     } 

UPDATE: 我修改了btnSave_Click按钮是如下:

//For updating the GridView (Save Button) 
     protected void btnSave_Click(object sender, EventArgs e) 
     { 
      GridView GridView1 = (GridView)sender; 
      // Are there checked boxes? 
      List<int> CheckBoxList = new List<int>(); 
      for (int i = 0; i < GridView1.Rows.Count; i++) 
      { 
       int courseid = (int)GridView1.DataKeys[i][0]; 
       CheckBox checkBox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox"); 
       if (checkBox.Checked) 
       { 
        CheckBoxList.Add(courseid); 
       } 
      } 
     } 

,但我得到了以下错误: Sys.WebForms.PageRequestManagerServerErrorException:无法转换类型的对象'System.Web.UI.WebControls.Button'键入'System.Web.UI.WebControls.GridView'

我不知道为什么我得到这个错误。任何人都可以帮助我吗?

回答

0

无效投射btnSave_Clicksender变量具有Button对象的引用。您必须使用Repeater.Items集合才能访问GridView对象。

你的代码应该是:

protected void btnSave_Click(object sender, EventArgs e) 
{ 
    for(int i=0;i<Repeater1.Items.Count;i++) 
    {    
     GridView GridView1 = (GridView)Repeater1.Items[i].FindControl("GridView1"); 
     List<int> CheckBoxList = new List<int>(); 
     for (int i = 0; i < GridView1.Rows.Count; i++) 
     { 
      int courseid = (int)GridView1.DataKeys[i][0]; 
      CheckBox checkBox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox"); 
      if (checkBox.Checked) 
       { 
       CheckBoxList.Add(courseid); 
       } 
      } 
     } 
    } 
+0

感谢您的帮助,但我得到一个错误:Sys.WebForms.PageRequestManagerServerErrorException:索引超出范围。必须是非负数且小于集合的大小。参数名称:索引。我也不知道我也有这个错误。你能帮我解决这个问题吗? –

+0

@ MohammedAl-Ali - 我的帖子中没有测试过代码。我可以根据你发布的代码建议你。 – adatapost

0
  protected void btnSaveRankChanges_Click(object sender, EventArgs e) 
      { 
       foreach (GridViewRow grv in GridViewRankChanges.Rows) 
       { 
        CheckBox changeRankCheck = (CheckBox)grv.Cells[0].FindControl("CheckBoxRankChange"); 
    if (changeRankCheck != null && changeRankCheck.Checked == true) 
     { 
       //Do your work for selected checkbox 
     } 
    } 
} 

希望它能帮助。

+0

由于我是一名新的ASP.NET开发人员,请问您可以向我解释您的意思是什么(FindControl(“CheckBoxRankChange”);)? –

+0

你的情况是chkSelect用于findcontrol – Neha

+0

http://forums.asp.net/t/1242849。aspx/1你也可以检查这个 – Neha

0

在visual basic .net中我们经常用来循环遍历网格视图。例如

Privtae Sub Button1_Click(sender As Object, e As System.EventArgs) 
    Dim rows as gridviewrows 

    For Each rows in gridview1.rows 
    dim chkbox as new checkbox 

     'since we find specific control with unique id so we use to find that control by   
     'using the method FindControl 

     chkbox = rows.findcontrol("chkInGridview") 

     if chkbox.checked then 
     'your code goes here 
     else 
     'your code goes here 
     end if 

    Next 
End Sub 

P/S:

你在许多方面解决这个问题。你可以尝试使用嵌套的gridview。

+0

op正在尝试在C#中做不在vb.net –

+0

是的,我使用C# –

相关问题