Я пытаюсь вернуть в строке выбранные элементы из динамически связанного элемента управления флажком без везения. Я надеюсь, что кто-то может помочь. В моем коде за файлом я склоняюсь к классу, называемому пользователями, и создаю datatable. Затем я привязываю таблицу данных к элементу управления cblist
private void populateUserList() //called on page load
{
SubmitOptions mySubmission = new SubmitOptions(juris, rptType, tmplName);
if (mySubmission.Users.Count == 0)
{
lbl_juris.Visible = false;
cb_selectUser.Visible = false;
lbl_AlertMsg.Visible = true;
btnSelect.Visible = false;
lbl_AlertMsg.Text = "No supervisors listed for jursidiction: " + juris.ToString();
}
else
{
dt.Columns.Add("Users");
for (int i = 0; i < mySubmission.Users.Count(); i++)
{
DataRow dr = dt.NewRow();
dr["Users"] = mySubmission.Users[i];
dt.Rows.Add(dr);
}
cb_selectUser.DataSource = dt;
cb_selectUser.DataBind();
}
}
Внутри основного файла aspx у меня есть элемент управления, определяемый как:
<asp:CheckBoxList ID="cb_selectUser"
Width="400px"
Height="100%"
AutoPostBack="false"
runat="server"
CellPadding="2"
CellSpacing="5"
DataTextField="Users"
DataValueField="Users"
>
</asp:CheckBoxList>
Я пробовал следующий код, в котором я повторяюсь в списке, но это работает только в том случае, если я жестко кодирует значения в списке Checkboxt как listitems.
protected void btn_returnUserList(object sender, System.Web.UI.ImageClickEventArgs e)
{
for (int i = 0; i < cb_selectUser.Items.Count; i++)
{
if (cb_selectUser.Items[i].Selected)
{
selectedUsers += cb_selectUser.Items[i].Text;
}
}
Список заполняется отлично, и все, что я хочу сделать, это вернуть в строку все выбранные пользователи из элемента управления флажком.
Как я уже сказал, если я буду жестко закодировать значения элемента в элементе управления, приведенный выше код работает, и я могу видеть выбранные элементы в строке, но удалять теги itemslist и переключиться на привязку nothign. Вышеупомянутый метод подсчитывает все количество возвратов, но ничего не возвращается.
Любые советы или предложения относительно того, что мне не хватает, будут очень признательны.
здесь полный код страницы, работающий точно так, как вы этого хотите. просто добавьте CheckboxList, чтобы сформировать его имя в list1, добавьте его имя в btn и добавьте ярлык и назовите его lbl.
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
var dt = new DataTable();
dt.Columns.Add("Users");
const string str = "User {0}";
for(var i=1;i<=10;i++)
{
//var r = dt.NewRow();
//r.ItemArray=new object[]{string.Format(str,i)};
dt.Rows.Add(new object[] {string.Format(str, i)});
}
list1.DataSource = dt;
list1.DataTextField = "Users";
list1.DataBind();
}
}
protected void btn_Click(object sender, EventArgs e)
{
var s = list1.Items.Cast<ListItem>()
.Where(item => item.Selected)
.Aggregate("", (current, item) => current + (item.Text + ", "));
lbl.Text = s.TrimEnd(new[] {',', ' '});
}
string skills="";
for(int i=0;i<chkboxlist.Items.Count;i++)
{
if(chkboxlist.Items[i].Selected)
{
skills=skills+chkboxlist.Items[i].Text+",";
}
}
skills = skills.Remove(skills.Length-1);
lblResult.Text = skills.ToString();
1- Загрузите Jquery.json.js и добавьте его в свое мнение как refrence:
<script src="../../Scripts/jquery.json.js" type="text/javascript"></script>
2- I've added a ".cssMyClass" to all checkboxlist items so I grab the values by their css class:
<script type="text/javascript" >
$(document).ready(function () {
$("#btnSubmit").click(sendValues);
});
function populateValues()
{
var data = new Array();
$('.myCssClas').each(function () {
if ($(this).attr('checked')) {
var x = $(this).attr("value");
data.push(x);
}
});
return data;
}
function sendValues() {
var data = populateValues();
$.ajax({
type: 'POST',
url: '@Url.Content("~/Home/Save")',
data: $.json.encode(data),
dataType: 'json',
contentType: 'application/json; charset=utf-8',
success: function () { alert("1"); }
});
}
</script>
3 Как вы можете видеть, я добавил все выбранные значения в массив, и я передал его в "Сохранить" действие "Домашнего" контроллера ajax 4- в контроллере вы можете получить значения, добавив массив в качестве аргумента:
[HttpPost]
public ActionResult Save(int[] val)
{
Я искал слишком много, но, видимо, это единственное решение. Пожалуйста, дайте мне знать, если вы найдете для него лучшее решение.
Вы уверены, что populateUserList() вызывается только один раз? (т.е. не на обратной стороне). Если он дважды вызван, выбранная коллекция элементов будет пустой.
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
populateUserList();
}
}
Можете ли вы использовать отправителя для извлечения выбранных элементов и посмотреть, получится ли у вас тот же результат?
protected void btn_returnUserList(object sender, System.Web.UI.ImageClickEventArgs e)
{
CheckBoxList cbl = sender as CheckBoxList;
if (sender == null) {
throw new Exception("Sender is not a CheckBoxList");
}
for (int i = 0; i < cbl.Items.Count; i++)
{
if (cbl.Items[i].Selected)
{
// Also, set a breakpoint here... are you hitting this line?
selectedUsers += cbl.Items[i].Text;
}
}
Кроме того, проверьте, попадаете ли вы в блок для выбранных элементов... регистрируются ли они как выбранные, но не получают текст обратно? Или элементы не отображаются в первую очередь?
Попробуйте следующее: -
foreach (ListItem li in cb_selectUser.Items)
{
//Your Code
}
Вам нужно убедиться, что ваш checkboxlist имеет привязку к базе данных, прежде чем пытаться извлечь из нее значения.
У меня была такая же проблема. Вы должны привязать CheckBoxList
следующим образом:
if(!IsPostBack)
{
//Bind your checkboxlist
}
Linq
предложениемWhere
, чтобы получать только выбранные элементы.