单击CheckBoxList上的项时需要显示某些内容

时间:2009-12-08 19:00:41

标签: c# .net asp.net visual-studio-2008

嘿那里,我遇到了这个非常恼人的问题:我有一个CheckBoxList从数据源中获取带有它的值的所有项目。我需要的是在Checks值为“33”的Item时显示一些面板。所以我需要获得Clicked Item,Last Clicked或者其他东西......我尝试了很多方法,它只是不起作用......以下3行中没有一行可以获得我需要的价值:

protected void chkServicos_SelectedIndexChanged(object sender, EventArgs e)
    {
          //
          // Just trying to get the "clicked" value
          //

          CheckBoxList cbl = sender as CheckBoxList;
          Response.Write(cbl.SelectedIndex);
          Response.Write(cbl.SelectedItem);
          Response.Write(cbl.SelectedValue);
    }

9 个答案:

答案 0 :(得分:2)

你做错了什么。很可能你假设33将是.SelectedValue的值。如果列表中有多个项目,则SelectedValue将仅生成所选的第一个项目。此代码有效:

 <form id="form1" runat="server">
    <asp:CheckBoxList ID="CheckBoxList1" runat="server" 
        onselectedindexchanged="CheckBoxList1_SelectedIndexChanged">
        <asp:ListItem Value="33">33</asp:ListItem>
        <asp:ListItem Vaue="Not 33">Not 33</asp:ListItem>
    </asp:CheckBoxList>
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
    </form>

  protected void CheckBoxList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Response.Write((sender as CheckBoxList).SelectedValue); // prints 33 if 33 is selected
    }

当然,如果您在列表中选择了多个项目,结果可能与您的预期不符。你可以考虑这样的事情:

  ListItem selected33 = CheckBoxList1.Items.Cast<ListItem>()
  .Where(item => item.Value == "33" && item.Selected).SingleOrDefault();

    if (selected33 != null)
    {
        Response.Write("33 is selected");
    }

答案 1 :(得分:1)

您可能需要存储已检查值的集合,然后在触发该事件时,在所选项目与集合之间进行差异处理。 checkboxList的选定项目和值属性总是返回其所选项目集合中的第一项。

答案 2 :(得分:1)

我无法从你的问题中说出来,但我的猜测是你可能在你的方法处理SelectedIndexChanged事件之前重置了复选框的值(之前我已经这样做了!)

在调用该处理程序之前,必须从ViewState在服务器上完全重建页面,因此调用Page_LoadPage_Init方法(以及其他方法)。如果在这些方法处理程序中将值绑定到列表,则最终将覆盖列表选项,并且所选索引将重置为默认值。或者,您可能正在使用其中一种方法设置默认选定索引。要防止这种情况发生,请确保将数据源绑定在if中,如下所示:

if (!Page.IsPostBack) { .. }

答案 3 :(得分:1)

如果你不反对某些javascript,这可能会有效:

ASPX

<div>
        <asp:HiddenField ID="cblLastChecked" runat="server" Value="" />
        <asp:CheckBoxList ID="cbl" runat="server" AutoPostBack="true" >
            <asp:ListItem Text="11" Value="11"></asp:ListItem>
            <asp:ListItem Text="22" Value="22"></asp:ListItem>
            <asp:ListItem Text="33" Value="33"></asp:ListItem>
        </asp:CheckBoxList>
    </div>

<script language="javascript">
    function CheckBoxListClickHandler(sender) {
        //the sender is the checkbox, but the value is in a label below
        var label = sender.nextSibling;
        var lastChecked = document.getElementById("cblLastChecked");
        if(label != null && lastChecked != null) 
        { 
            lastChecked.value = label.innerText;
        }
        //alert(lastChecked.value);
    }
</script>

CS

protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            foreach (ListItem item in this.cbl.Items)
            {
                item.Attributes.Add("onclick", "javascript:CheckBoxListClickHandler(this)");
            }

            this.cbl.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged);
        }

        void list_SelectedIndexChanged(object sender, EventArgs e)
        {
            string targetValue = "33";
            if (this.cblLastChecked.Value == targetValue)
            {
                ListItem item = this.cbl.Items.FindByValue(targetValue);
                if (item != null && item.Selected)
                {
                    //Show Panel
                }
                else
                {
                    //hide panel
                }
            }
        }

答案 4 :(得分:1)

页面加载:

if (!Page.IsPostBack)
    {

        ViewState["Clicked"] = false;
    }

SelectedChanged:

CheckBoxList clicked = (CheckBoxList)sender;
    bool selected = clicked.Items.FindByValue("33").Selected;

    if (selected)
    {
        if (Convert.ToBoolean(ViewState["Clicked"]) == false)
        {
            //do something
            ViewState["Clicked"] = true;
        }
    }
    else
    {
        ViewState["Clicked"] = false;
    }

答案 5 :(得分:0)

试试这个:

cbl.SelectedItem.Checked that should return true / false
cbl.SelectedItem.Text that should return the actual string
cbl.SelectedValue.Text that should return the value bound

答案 6 :(得分:0)

尝试硬编码:

<asp:ListItem value="33">This Item</asp:ListItem>

这应该使cbl.SelectedValue等于字符串“33”。如果可行,请更新数据绑定以确保列表项的绑定到正确的数据成员。

答案 7 :(得分:0)

CheckBoxList cbl = sender as CheckBoxList;
ListItem item = cbl.Items.FindByValue("33");
if (item != null && item.Selected) 
{
  //Show Panel
}        

答案 8 :(得分:0)

要获取触发SelectedIndexChanged事件的单击值(无需手动存储最后一个状态),您可以使用此

protected void checkboxlist_SelectedIndexChanged(object sender, EventArgs e)
{
        CheckBoxList list = (CheckBoxList)sender;
        string[] control = Request.Form.Get("__EVENTTARGET").Split('$');
        int idx = control.Length - 1;
        string sel = list.Items[Int32.Parse(control[idx])].Value;  
 }