识别asp listview对象中的所选复选框

时间:2015-03-27 22:21:03

标签: c# asp.net

我一直在尝试理解ASP中的ListView对象,但我无法以编程方式获取所选复选框或迭代它们。以下是我在SO上看到的最常用的两种方法,但到目前为止,我尝试的所有方法似乎都不适合我。

非常感谢任何帮助。

.ASPX Page

<asp:ListView ID="courseListView" runat="server">

<LayoutTemplate>
<table><asp:PlaceHolder runat="server" ID="itemPlaceholder">      
</asp:PlaceHolder></table>
</LayoutTemplate>

<ItemTemplate>
          <tr>
          <td><asp:CheckBox ID="courseIdchk" Text='<%# Eval("CourseId") %>' runat="server" /></td>
          <td><asp:Label ID="courseTitleLbl" Text='<%# Eval("title") %>' runat="server" /></td>
          </tr>
</ItemTemplate>
</asp:ListView>

.CS代码背后

//Method #1
      string result = string.Join(", ",    courseListView.Controls.OfType<CheckBox>()
                      .Select(chk => chk.Text));
      string result = "";

  //Method #2
  foreach (CheckBox ctrl in courseListView.Controls.OfType<CheckBox>())
  {
      result2 += ctrl.Text;
  }

  Response.Write("<p>The result is " + result);
  Response.Write("<p>The result is " + result2);
  Response.End();

1 个答案:

答案 0 :(得分:0)

我不在Visual Studio附近,但在我的脑海中,我看到了两个没有迭代的原因。 1.您应该使用OnLoad方法将此ListView绑定到源:

if (!IsPostback) {
  courseListView.DataSource = GetCourses();
  courseListView.DataBind();
}

2。 courseListView.Controls不包含CheckBox类型的项目,因此OfType<CheckBox>()会过滤掉所有元素。如果你调试并在foreach (CheckBox ctrl in courseListView.Controls.OfType<CheckBox>())上放置一个断点,你会看到CheckBox是courseListView的子子节点之一。所以根据哪个控件包含CheckBoxes来编写适当的逻辑来构建你的逻辑:

    var checkBox = courseListView.Controls.Cast<Control>().First().FindControl("courseIdchk");

同样,上面的代码假定复选框是控件的子级,它是courseListView的唯一子级。

<强>更新

var findCheckedQuery = courseListView.Controls[0]
                .Controls
                .Cast<Control>()
                .Select(ctrl => ctrl.FindControl("chkBox") as CheckBox)
                .Where(chk => chk != null && chk.Checked);                
result = string.Join(":", findCheckedQuery.Select(x => x.Text).ToArray());

<强> UPDATE2

ASPX:

<asp:Repeater ID="courseListView" runat="server">
        <ItemTemplate>
            <asp:CheckBox ID="chkBox" data-id="<%#((Course)Container.DataItem).CourseId %>" Text="<%#((Course)Container.DataItem).Title %>" runat="server" />
            <br/>
        </ItemTemplate>
    </asp:Repeater>
    <asp:Button runat="server" UseSubmitBehavior="True" Text="Submit"/>

代码隐藏:

protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        if (!IsPostBack)
        {
            courseListView.DataSource = GetCourses();
            courseListView.DataBind();
        }
        else
        {
            var result = string.Empty;

            var findCheckedQuery = courseListView
                .Controls
                .Cast<Control>()
                .Select(x => (CheckBox)x.FindControl("chkBox"))
                .Where(x => x.Checked)
                .Select(x => x.Text);
            result = string.Join(", ", findCheckedQuery.ToArray());
        }
    }