复选框仅从一个复选框中获取值。选中

时间:2017-07-25 17:38:35

标签: c# asp.net checkbox

我在检查时尝试让Checkbox接收多个值时遇到了一些问题。我正在使用动态GridView。选中复选框并单击“开始”按钮后,系统将启动服务。只有一个服务正在启动,而其他已检查服务的值读取为false。我知道我做错了什么。提前谢谢!

<asp:Panel ID="Panel1" runat="server">
  <asp:GridView ID="GridView1" runat="server" Style="font-size: 15pt" AutoGenerateColumns="False">
    <Columns>
      <asp:BoundField DataField="ServiceName" HeaderText="Service Name" />
      <asp:BoundField DataField="Description" HeaderText="Description" />
      <asp:BoundField DataField="Status" HeaderText="Status" />
      <asp:TemplateField>
        <ItemTemplate>
          <asp:CheckBox ID="ChkStatus" Enabled="True" runat="server"  />
        </ItemTemplate>
      </asp:TemplateField>
    </Columns>
  </asp:GridView>
</asp:Panel>


protected void strBtn_Click(object sender, EventArgs e)
{
var dt = new DataTable();
dt.Columns.Add("ServiceName", typeof(string));
dt.Columns.Add("Description", typeof(string));
dt.Columns.Add("Status", typeof(string));

string include = txtbox_Inclusion.Text;
string exclude = txtbox_Exclusion.Text;

ServiceController[] services = ServiceController.GetServices();

foreach (ServiceController service in services)
{
    if (service.ServiceName.StartsWith(include) && !service.ServiceName.Contains(exclude))
    {
        var dro = dt.NewRow();
        dro["ServiceName"] = service.ServiceName;
        dro["Description"] = service.DisplayName;
        dro["Status"] = service.Status;
        dt.Rows.Add(dro);

        for (int i = 0; i < GridView1.Rows.Count; i++)//loop the GridView Rows
        {
            CheckBox cb = (CheckBox)GridView1.Rows[i].Cells[0].FindControl("ChkStatus"); //find the CheckBox
            if (cb != null)
            {
                if (cb.Checked)
                {
                    service.Start();
                    service.WaitForStatus(ServiceControllerStatus.Running);
                    dro["Status"] = service.Status;
                }
                else if (cb.Checked && service.Status == ServiceControllerStatus.Running)
                {
                    cb.Enabled = false;
                }
            }
        }
        GridView1.DataSource = dt;
        GridView1.DataBind();
        }
    }
}

2 个答案:

答案 0 :(得分:2)

使用for循环完全迭代对象集合并不是正确的工具。考虑实施LINQ的foreach循环,以确保您通过每个唱歌对象。

对于您的示例,不要使用for (int i = 0; i < GridView1.Rows.Count; i++),而是将其替换为:foreach(GridViewRow row in GridView1.Rows)

答案 1 :(得分:0)

我不是很确定,但我最初的回答是首先启动服务可能会将程序发送到另一个进程,它永远不会回到原来的“如果&#39;声明。不知道它是否有效,或者如何工作,但也许你需要为每个项目使用不同的线程?