Jak programowo utworzyć i używać listę wyboru z ASP.NET?

głosy
4

Mam stronę z tabelą rzeczy i muszę pozwolić użytkownikowi wybrać wiersze do procesu. Mam zorientowali się, jak dodać kolumnę pól wyboru w tabeli, ale nie może wydawać się, aby dowiedzieć się, jak sprawdzić, czy są one sprawdzane, gdy formularz jest składany. Gdyby były elementy statyczne, byłbym w stanie zrobić tylko sprawdzić this.theCheckBox, ale są one programaticly generowane.

Również nie jestem bardzo zadowolony z tego, jak ja mocowania moje dane do nich (przez farsz go tam mienia osobistego).

Nie jestem pewien, czy to istotne, ale patrzę na kawałku catch-22, jak muszę wiadomo, który z wyboru, które zostały utworzone po raz ostatni około zostały sprawdzone przed mogę ponownie uruchomić kod, który je stworzył.


Edit: Znalazłem to prawie rozwiązanie. Poprzez ustawienie AutoPostBackwłaściwości i CheckedChangedzdarzenia:

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

Mogę dostać kod na miano na post Powrót do dowolnego pola wyboru, która została zmieniona. Jednak ten ma dwa problemy:

  • Wezwanie jest przetwarzany z powrotem po (lub w czasie, nie jestem pewien) Page_Load, gdzie trzeba użyć tych informacji
  • Wezwanie do tyłu nie jest wywoływana dla pól wyboru, które zostały sprawdzone, gdy strona załadowana i nadal są.

Edit 2:

Co skończyło się robi został tagging wszystkie moje identyfikatory z prefiksem to wiedzieć i farsz na górze Form_Load:

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

wszystko wydaje się działać zbyt późno.

Utwórz 24/07/2009 o 23:16
źródło użytkownik
W innych językach...                            


7 odpowiedzi

głosy
1

Po pierwsze, upewnij się, że każde pole wyboru ma identyfikator i że ma się „runat =«server»” w tagu.

następnie użyć funkcji FindControl (), aby go odnaleźć.

Na przykład, jeśli jesteś zapętlenie przez wszystkich wierszy w widoku GridView ..

foreach(GridViewRow r in Gridview1.Rows)
{

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

}
Odpowiedział 24/07/2009 o 23:44
źródło użytkownik

głosy
2

Mam zamiar założyć używasz DataList ale ten powinien pracować i sterowania, które mogą być na matrycy. Mam również zamiar założyć używasz DataBinding.

Kod z przodu:

<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>

Kod Za:

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);                
        }
    }
}
Odpowiedział 25/07/2009 o 00:56
źródło użytkownik

głosy
0

Twój post jest trochę niejasne. To pomaga zobaczyć, jak jesteś dodawania formantów do stołu. Czy to ASP: Tabela lub regularne tabeli HTML (przypuszczalnie z atrybutem runat = „server” odkąd został dodany do niego elementów)?

Jeśli zamierzasz pozwolić użytkownikowi zrobić kilka wyborów, a następnie uderzył w przycisk „Wyślij”, po czym będziesz przetwarzać każdy wiersz w oparciu o który wiersz jest zaznaczone, wówczas nie powinno być obsługi zdarzeń CheckChanged. W przeciwnym razie, jak zauważyłeś, będziesz powoduje odświeżenie strony za każdym razem i nie będzie przetwarzać którykolwiek z pozostałych pól wyboru. Więc podczas tworzenia CheckBox nie ustawia eventhandler więc nie powoduje odświeżenie strony.

W swojej przycisk przesyłania za eventhandler byś pętli każdego wiersza tabeli, komórka, a następnie ustalić, czy komórki dzieci kontrola zawierała pole.

Proponuję nie przy użyciu tabeli. Z tego co opisujesz może GridView lub DataList jest lepszym rozwiązaniem.


EDIT: oto prosty przykład wykazać. Powinieneś być w stanie uzyskać tej pracy w nowym projekcie w celu przetestowania.

Narzut

    <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>

Kod z opóźnieniem

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 />");
                    }
                }
            }
        }
    }
}
Odpowiedział 25/07/2009 o 00:58
źródło użytkownik

głosy
1

Postback przywróceniem danych między zdarzeniem InitComplete a wydarzeniem napięcia wstępnego. Pola wyboru, jeśli nie są tworzone dopiero później następnie pola wyboru zagra „dogonić” z ich imprez, a dane zostaną załadowane do sterowania wkrótce po jej utworzeniu.
Jeśli to jest późno, a następnie będzie musiał zrobić coś, co już robisz. Czyli trzeba będzie uzyskać dostęp do danych post zanim zostanie podane do kontroli.
Jeśli można zapisać UniqueIdkażdegoCheckBoxutworzenie następnie można bezpośrednio uzyskać dostęp do danych post bez konieczności dał im specjalny prefiks. Można to zrobić poprzez stworzenie listy ciągów znaków, które można zapisać identyfikatory w miarę ich generowania i zapisywania ich w stanie widoku. Oczywiście, że wymaga stan widoku włączonego i zajmuje więcej miejsca w stan wyświetlania.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
Odpowiedział 27/07/2009 o 21:56
źródło użytkownik

głosy
0

Co na temat korzystania z CheckBoxList kontroli? Nie mam Visual Studio otworzyć teraz, ale o ile pamiętam jest to kontrola z danymi, zapewniając DataSourcei DataBind()gdzie można dostarczyć listę przy starcie. Gdy strona nie odświeżenie strony można przemierzać listę wywołując coś podobnego myCheckBoxList.Itemsi sprawdzić, czy bieżąca pozycja jest wybrana przez wywołanie ListItem.Selectedmetody. To powinno działać.

Odpowiedział 27/07/2009 o 22:03
źródło użytkownik

głosy
0

Dodać je do nadpisania metody CreateChildControls strony. Pamiętaj, aby dać im ID! W ten sposób są dodawane do drzewa kontroli w odpowiednim czasie.

IMHO Najlepszym sposobem byłoby użyć z danymi na matrycy Sterowanie chociaż, czyli coś w ListView (w .NET 3.5). następnie w pageload po odświeżenie przemierzać wszystkie artykuły z kontrolą z danymi i korzystania item.FindControl aby dostać się do rzeczywistego wyboru.

Odpowiedział 27/07/2009 o 22:03
źródło użytkownik

głosy
0

Co skończyło się robi został tagging wszystkie moje identyfikatory z prefiksem to wiedzieć i farsz na górze Form_Load:

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

wszystko wydaje się działać zbyt późno.

Odpowiedział 23/08/2009 o 23:05
źródło użytkownik

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