嘿那里,我遇到了这个非常恼人的问题:我有一个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);
}
答案 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_Load
和Page_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;
}