Wie programm erstellen und eine Liste von Kontrollkästchen von ASP.NET verwenden?

stimmen
4

Ich habe eine Seite mit einer Tabelle von Sachen und ich brauche , damit der Benutzer die Auswahl der Zeilen zu verarbeiten. Ich habe herausgefunden, wie eine Spalte mit Kontrollkästchen in die Tabelle hinzuzufügen , aber ich kann nicht scheinen , um herauszufinden , wie zu testen , ob sie überprüft werden , wenn das Formular abgeschickt wird. Wenn sie statische Elemente wären, würde ich in der Lage sein, nur tun zu überprüfen , this.theCheckBoxaber sie sind programaticly erzeugt.

Auch ich bin nicht sehr glücklich darüber, wie ich meine Daten zu ihnen bin Befestigung (durch dort ID-Eigenschaft Füllung).

Ich bin mir nicht sicher , ob es relevant ist, aber ich freue mich auf ein bisschen wie ein Catch-22 , wie ich , welche der Kontrollkästchen bekannt müssen die erstellt wurden , um das letzte Mal überprüft wurden , bevor ich den Code erneut ausführen können , die sie geschaffen haben .


Edit: Ich habe eine fast Lösung gefunden. Durch die Einstellung AutoPostBackEigenschaft und die CheckedChangedVeranstaltung:

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

Ich kann Code erhalten auf einem Post zurück für jede Kontrollkästchen aufgerufen werden, die sich geändert hat. Dies hat jedoch zwei Probleme:

  • Der Rückruf wird verarbeitet , nach (oder während, ich bin mir nicht sicher) , Page_Loadwo ich diese Informationen benutzen , müssen
  • Der Rückruf ist nicht für Kontrollkästchen genannt, die geprüft wurden, wenn die Seite geladen und sind nach wie vor.

Edit 2:

Was ich am Ende tat alles ist meine Identifikation mit einem Know - Präfix wurde Tagging und dies an der Spitze Füllung Form_Load:

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

alles andere scheint zu spät zu laufen.

Veröffentlicht am 24/07/2009 um 23:16
quelle vom benutzer
In anderen Sprachen...                            


7 antworten

stimmen
1

Erstens, stellen Sie sicher, dass jedes Kästchen zum Ankreuzen eine ID hat und dass es den ‚runat =‚server‘‘ in dem Tag bekam.

dann verwenden Sie die Findcontrol () Funktion, es zu finden.

Zum Beispiel, wenn Sie durch alle Reihen in einem Gridview sind Looping ..

foreach(GridViewRow r in Gridview1.Rows)
{

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

}
Beantwortet am 24/07/2009 um 23:44
quelle vom benutzer

stimmen
2

Ich werde Sie mit einem Datalist zu übernehmen, aber dies sollte mit und Kontrolle arbeiten, die als Templat werden können. Ich werde auch davon ausgehen, Sie verwenden Databinding.

Code Front:

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

Code Behind:

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);                
        }
    }
}
Beantwortet am 25/07/2009 um 00:56
quelle vom benutzer

stimmen
0

Ihr Beitrag ist ein wenig vage. Es würde helfen, zu sehen, wie Sie Steuerelemente in der Tabelle sind hinzuzufügen. Ist es ein ASP: Tabelle oder eine normale HTML-Tabelle (vermutlich mit runat = „server“ -Attribut, da Sie erfolgreich Elemente hinzugefügt haben)?

Wenn Sie beabsichtigen, den Benutzer zu lassen, eine Reihe von Auswahl treffen, drücken Sie dann eine Schaltfläche „Senden“, worauf Sie jede Zeile verarbeitet werden, basierend auf welche Zeile markiert ist, dann sollten Sie nicht die CheckChanged Veranstaltung Handhabung. Ansonsten, wie Sie bemerkt haben, werden Sie einen Postback jedes Mal zu verursachen, und es wird keine der anderen Kontrollkästchen verarbeiten. Also, wenn Sie die CheckBox schaffen nicht die Eventhandler so eingestellt, dass sie nicht ein Postback verursacht.

In Ihrem Eventhandler des Submit-Button würden Sie Schleife durch jede Zeile der Tabelle, Zelle, dann bestimmen, ob die Kinder Kontrolle der Zelle ein Kontrollkästchen enthalten.

Ich würde vorschlagen, eine Tabelle nicht verwenden. Von dem, was Sie beschreiben, vielleicht einen Gridview oder Datalist ist eine bessere Option.


EDIT: Hier ist ein einfaches Beispiel zu demonstrieren. Sie sollen diese Arbeiten in einem neuen Projekt erhalten können , zu testen.

Markup

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

Code-behind

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 />");
                    }
                }
            }
        }
    }
}
Beantwortet am 25/07/2009 um 00:58
quelle vom benutzer

stimmen
1

Postbacks Daten zwischen dem Initcomplete Ereignisse und dem PreLoad Ereignisse gestellt. Wenn Ihr Kontrollkästchen nicht erstellt werden , bis später dann das Kontrollkästchen spielt „aufholen“ mit ihren Veranstaltungen und die Daten werden in die Steuerung geladen werden , kurz nachdem sie erstellt wird.
Wenn dies zu spät für Sie , dann werden Sie so etwas wie zu tun haben , was Sie bereits tun. Das heißt Sie die Post - Daten zugreifen müssen, bevor es an die Steuerung gegeben wird.
Wenn Sie das Speichern UniqueIdvon jedemCheckBoxschaffen, dass Sie dann, um die Post-Daten direkt zugreifen können sie ein spezielles Präfix gegeben, ohne. Sie können dies tun, indem Sie eine Liste von Strings zu schaffen, die die IDs in speichern, wie Sie sie erzeugen und sie dann in der Ansicht Zustand zu speichern. Natürlich, die die Ansicht Zustand erfordern aktiviert werden und mehr Platz im Ansichtszustand einnimmt.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
Beantwortet am 27/07/2009 um 21:56
quelle vom benutzer

stimmen
0

Was ist die Verwendung von CheckBoxList Kontrolle? Ich habe kein Visual Studio jetzt öffnen, aber soweit ich erinnere mich , es ist eine Databound - Kontrolle, Bereitstellung DataSourceund DataBind()wo Sie eine Liste zur Laufzeit zur Verfügung stellen können. Wenn die Seite ein Postback funktioniert können Sie die Liste durchlaufen nach wie etwas aufrufen myCheckBoxList.Itemsund prüfen , ob der aktuelle Eintrag durch den Aufruf ausgewählt ist ListItem.SelectedMethode. Das sollte funktionieren.

Beantwortet am 27/07/2009 um 22:03
quelle vom benutzer

stimmen
0

Fügen Sie sie in einer Überschreibung der Create Methode der Seite. Achten Sie darauf, ihnen eine ID zu geben! So können sie zum richtigen Zeitpunkt an den Steuerbaum hinzugefügt bekommen.

IMHO Der beste Weg wäre Databound verwenden Templated Kontrolle obwohl, also so etwas wie eine Listview (in .NET 3.5). dann in Pageload nach dem Postback alle Elemente in der Databound - Steuerung durchqueren und item.FindControl bei der tatsächlichen Kontrollkästchen bekommen verwenden.

Beantwortet am 27/07/2009 um 22:03
quelle vom benutzer

stimmen
0

Was ich am Ende tat alles ist meine Identifikation mit einem Know - Präfix wurde Tagging und dies an der Spitze Füllung Form_Load:

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

alles andere scheint zu spät zu laufen.

Beantwortet am 23/08/2009 um 23:05
quelle vom benutzer

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