Как программно создавать и использовать список флажков из ASP.NET?

голоса
4

У меня есть страница с таблицей вещей , и мне нужно , чтобы позволить пользователю выбрать строки для обработки. Я понял, как добавить колонку флажков к столу , но я не могу показаться , чтобы выяснить , как проверить , если они проверяются , когда форма была отправлена. Если бы они были статические элементы, я бы иметь возможность просто проверить делать , this.theCheckBoxно они programaticly генерируется.

Кроме того, я не очень доволен тем, как я прикрепление моих данных к ним (наполняя его там ID собственность).

Я не уверен , если это отношение , но я смотрю на немного улова-22 , как мне нужно известно , какая из флажков , которые были созданы в последний раз вокруг были проверены , прежде чем я могу повторно запустить код , который их создали.


Изменить: Я нашел почти решение. Установив AutoPostBackсвойство и CheckedChangedсобытие:

checkbox.AutoPostBack = false;
checkbox.CheckedChanged += new EventHandler(checkbox_CheckedChanged);

Я могу получить код, который будет призван на пост обратно любой флажок, который изменился. Однако это имеет две проблемы:

  • Обратный вызов обрабатывается после (или во время, я не уверен) , Page_Loadгде мне нужно использовать эту информацию
  • Обратный вызов не вызываются для флажков, которые были проверены, когда страница загружена, и до сих пор.

Изменить 2:

То , что я в конечном итоге делает был мечения все мои идентификаторы с приставкой ноу и начинку это в верхней части Form_Load:

foreach (string v in this.Request.Form.AllKeys)
{
    if (v.StartsWith(Prefix))
    {
        var data = v.Substring(Prefix.Length);
    }
}

все остальное, кажется, бежит до конца.

Задан 24/07/2009 в 23:16
источник пользователем
На других языках...                            


7 ответов

голоса
1

Во-первых, убедитесь, что каждый Checkbox имеет идентификатор и что он получил «RUNAT =„сервер“» в теге.

затем использовать функцию FindControl (), чтобы найти его.

Например, если вы цикл через все строки в GridView ..

foreach(GridViewRow r in Gridview1.Rows)
{

    object cb = r.FindControl("MyCheckBoxId");
    if(r != null)
    {
      CheckBox chk = (CheckBox)cb;
      bool IsChecked = chk.Checked;
    }

}
Ответил 24/07/2009 в 23:44
источник пользователем

голоса
2

Я предполагаю, что вы будете использовать DataList, но это должно работать и управление, которые могут быть шаблонным. Я также собираюсь предположить, что вы используете DataBinding.

Код Спереди:

<asp:DataList ID="List" OnItemDataBound="List_ItemDataBound" runat="server">
    <ItemTemplate>
        <asp:CheckBox ID="DeleteMe" runat="server"/>
        <a href="<%# DataBinder.Eval(Container, "DataItem.Url")%>" target="_blank">
            <%# DataBinder.Eval(Container, "DataItem.Title")%></a>
    </ItemTemplate>
</asp:DataList>
<asp:Button ID="DeleteListItem" runat="server" OnClick="DeleteListItem_Click" ></asp:Button>

Код Сзади:

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadList();
    }

    protected void DeleteListItem_Click(object sender, EventArgs e)
    {
        foreach (DataListItem li in List.Items)
        {
            CheckBox delMe = (CheckBox)li.FindControl("DeleteMe");

            if (delMe != null && delMe.Checked)
                    //Do Something
            }
        }

        LoadList();
    }

    protected void LoadList()
    {
        DataTable dt = //Something...
        List.DataSource = dt;
        List.DataBind();
    }

    protected void List_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
        {
            string id = DataBinder.Eval(e.Item.DataItem, "ID").ToString();
            CheckBox delMe = (CheckBox)e.Item.FindControl("DeleteMe");

            if (delMe != null)
                delMe.Attributes.Add("value", id);                
        }
    }
}
Ответил 25/07/2009 в 00:56
источник пользователем

голоса
0

Ваш пост является немного расплывчатым. Это помогло бы увидеть, как вы добавляете элементы управления в таблицу. Является ли это ASP: Таблица или обычный HTML таблицы (предположительно с RUNAT = атрибут «сервер», так как вы успешно добавили детали к ним)?

Если вы собираетесь, чтобы позволить пользователю сделать кучу выбора, затем нажмите кнопку «Submit», после чего вы будете обрабатывать каждую строку, на основании которых строка проверяется, то вы не должны обработки события CheckChanged. В противном случае, как вы уже заметили, вы будете вызывая постбэк каждый раз, и это не будет обрабатывать любого из других флажков. Поэтому при создании CheckBox не установить EventHandler так это не вызывает постбэк.

В EventHandler вашей кнопки отправки в вы Переберите каждую строку таблицы, ячейки, а затем определить, содержит ли ячейки управления дети флажка.

Я хотел бы предложить не используя таблицу. Из того, что вы описываете, может быть, в GridView или DataList является лучшим вариантом.


EDIT: Вот простой пример , чтобы продемонстрировать. Вы должны быть в состоянии получить эту работу в новом проекте , чтобы проверить.

наценка

    <form id="form1" runat="server">
    <div>
    <table id="tbl" runat="server"></table>
    <asp:Button ID="btnSubmit" runat="server" Text="Submit"
      onclick="btnSubmit_Click" />
    </div>
    </form>

Код-за

protected void Page_Load(object sender, EventArgs e)
{
    for (int i = 0; i < 10; i++)
    {
        var row = new HtmlTableRow();
        var cell = new HtmlTableCell();
        cell.InnerText = "Row: " + i.ToString();
        row.Cells.Add(cell);
        cell = new HtmlTableCell();
        CheckBox chk = new CheckBox() { ID = "chk" + i.ToString() };
        cell.Controls.Add(chk);
        row.Cells.Add(cell);
        tbl.Rows.Add(row);
    }
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
    foreach (HtmlTableRow row in tbl.Rows)
    {
        foreach (HtmlTableCell cell in row.Cells)
        {
            foreach (Control c in cell.Controls)
            {
                if (c is CheckBox)
                {
                    // do your processing here
                    CheckBox chk = c as CheckBox;
                    if (chk.Checked)
                    {
                        Response.Write(chk.ID + " was checked <br />");
                    }
                }
            }
        }
    }
}
Ответил 25/07/2009 в 00:58
источник пользователем

голоса
1

Postback данные восстанавливаются между событием Initcomplete и события преднагрузки. Если галочки нет, не создана , пока позднее флажки будут играть «догнать» их события и данные будут загружены в управление сразу после его создания.
Если это поздно для вас , то вам придется сделать что - то вроде того, что вы уже делаете. То есть вы будете иметь доступ к сообщению данных , прежде чем она дается с контролем.
Если вы можете сохранить UniqueIdкаждогоCheckBoxчто вы создаете, то можно непосредственно получить доступ к сообщению данных без необходимости дала им специальный префикс. Вы можете сделать это путем создания списка строк, которые вы сохраните идентификаторы, как вы их создания, а затем сохранить их в состоянии отображения. Конечно, это требует состояние просмотра быть включен и занимает больше места в ViewState.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
Ответил 27/07/2009 в 21:56
источник пользователем

голоса
0

Что об использовании CheckBoxList управления? У меня нет Visual Studio не открывать сейчас, но, насколько я помню , это контроль DataBound, обеспечивая DataSourceи DataBind()где вы можете предоставить список во время выполнения. Когда страница не постбэк вы можете пройти список вызвав что - то вроде myCheckBoxList.Itemsи проверьте, выбран ли текущий элемент с помощью вызова ListItem.Selectedметода. Это должно работать.

Ответил 27/07/2009 в 22:03
источник пользователем

голоса
0

Добавьте их в переопределение метода CreateChildControls страницы. Будьте уверены, чтобы дать им удостоверение личности! Таким образом, они добавляются к дереву управления в нужное время.

ИМХО Лучше всего было бы использовать DataBound шаблонного управления , хотя, то есть что - то вроде ListView (в .NET 3.5). затем в PageLoad после постбэк пройти все элементы в элементе управления с привязкой к данным и использовать item.FindControl получить при фактическом флажке.

Ответил 27/07/2009 в 22:03
источник пользователем

голоса
0

То , что я в конечном итоге делает был мечения все мои идентификаторы с приставкой ноу и начинку это в верхней части Form_Load:

foreach (string v in this.Request.Form.AllKeys)
{
    if (v.StartsWith(Prefix))
    {
        var data = v.Substring(Prefix.Length);
    }
}

все остальное, кажется, бежит до конца.

Ответил 23/08/2009 в 23:05
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more