Hvordan programma opprette og bruke en liste over boksene fra ASP.NET?

stemmer
4

Jeg har en side med en tabell over ting og jeg må tillate brukeren å velge rader å behandle. Jeg har funnet ut hvordan du legger til en kolonne med boksene på bordet, men jeg kan ikke synes å finne ut hvordan du kan teste om de er kontrollert når skjemaet er sendt. Hvis de var statiske elementer, ville jeg være i stand til å bare sjekke gjøre this.theCheckBox, men de er programaticly generert.

Også er jeg ikke veldig fornøyd med hvordan jeg legger ved mine data til dem (ved å stappe den inn der ID eiendom).

Jeg er ikke sikker på om det er relevant, men jeg ser på en bit av en catch-22 som jeg må kjent hvilke av de boksene som ble opprettet sist gang rundt ble sjekket før jeg kan å kjøre kode som skapte dem.


Edit: Jeg har funnet en nesten løsning. Ved å sette AutoPostBackeiendommen og CheckedChangedhendelsen:

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

Jeg kan få koden til å bli kalt på et innlegg tilbake for noen i boksen som er endret. Men dette har to problemer:

  • Samtalen tilbake er behandlet etter (eller under, er jeg ikke sikker på) Page_Loadder jeg trenger å bruke denne informasjonen
  • Samtalen ryggen er ikke kalt for boksene som ble sjekket når siden lastes og fortsatt er.

Edit 2:

Det jeg endte opp med å gjøre var merking alle mine IDer med en vet prefiks og stuffing dette på toppen av Form_Load:

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

alt annet synes å kjøre for sent.

Publisert på 24/07/2009 klokken 22:16
kilden bruker
På andre språk...                            


7 svar

stemmer
1

Først må du kontrollere at hver Avkryssningsboks har en ID, og ​​at det har den 'runat = 'server'' i koden.

da bruke FindControl () -funksjonen finner det.

For eksempel, hvis du looping gjennom alle radene i en Gridview ..

foreach(GridViewRow r in Gridview1.Rows)
{

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

}
Svarte 24/07/2009 kl. 22:44
kilden bruker

stemmer
2

Jeg kommer til å anta at du bruker en Datalist, men dette bør jobbe med og kontroll som kan malbasert. Jeg er også tenkt å anta at du bruker Databinding.

Kode Foran:

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

Kode Bak:

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);                
        }
    }
}
Svarte 24/07/2009 kl. 23:56
kilden bruker

stemmer
0

Innlegget ditt er litt vag. Det vil bidra til å se hvordan du legger kontroller til bordet. Er det en ASP: Table eller en vanlig HTML-tabell (formodentlig med en runat = "server" attributt siden du har lagt til elementer i den)?

Hvis du har tenkt å la brukeren få en haug med valg, og deretter traff en "Send" -knappen, hvorpå du vil behandle hver rad basert på hvilken rad er krysset av, så du bør ikke håndtere CheckChanged hendelsen. Ellers, som du har lagt merke til, vil du være forårsaker en postback hver gang, og det vil ikke behandle noen av de andre boksene. Så når du oppretter avmerkingsbokser ikke sette Event slik at det ikke føre til en postback.

I send-knappen er Event du ville sløyfe gjennom hver rad i tabellen, celle, og deretter avgjøre om cellens barn kontroll inneholdt en avkrysnings.

Jeg foreslår ikke å bruke en tabell. Fra det du beskriver kanskje en Gridview eller Datalist er et bedre alternativ.


EDIT: Her er et enkelt eksempel for å demonstrere. Du bør være i stand til å få dette arbeidet i et nytt prosjekt for å teste ut.

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

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 />");
                    }
                }
            }
        }
    }
}
Svarte 24/07/2009 kl. 23:58
kilden bruker

stemmer
1

Sendingsdata er gjenopprettet mellom InitComplete arrangementet og forspenningen arrangementet. Hvis boksene er ikke skapt til senere da boksene vil spille "catch up" med sine arrangementer og dataene vil bli lastet inn i kontroll kort tid etter at den er opprettet.
Hvis dette er for sent for deg så du blir nødt til å gjøre noe som det du allerede gjør. Det er du nødt til å få tilgang til legg til dataene før de blir gitt til kontroll.
Hvis du kan lagre UniqueIdav hver CheckBoxsom du oppretter da kan få direkte tilgang innlegget data uten å gitt dem en spesiell prefiks. Du kan gjøre dette ved å opprette en liste over strenger som du lagre IDer i som du generere dem og deretter lagre dem i visningen tilstand. Selvfølgelig som krever utsikten staten til å være aktivert og tar opp mer plass i Visningsstatusen.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
Svarte 27/07/2009 kl. 20:56
kilden bruker

stemmer
0

Hva med å bruke den CheckBoxList kontroll? Jeg har ingen Visual Studio åpne nå, men så vidt jeg husker det er en DataBound kontroll, gir DataSourceog DataBind()hvor du kan gi en liste under kjøring. Når siden gjør en postback du kan krysse listen ved å kalle noe sånt myCheckBoxList.Items, og sjekke om det gjeldende elementet velges ved å kalle ListItem.Selectedmetoden. Dette bør fungere.

Svarte 27/07/2009 kl. 21:03
kilden bruker

stemmer
0

Legg dem i en overstyring av CreateChildControls metoden på siden. Sørg for å gi dem en ID! Denne måten de blir lagt til kontrolltreet på riktig tidspunkt.

IMHO den beste måten ville være å bruke DataBound templated kontroll selv, det vil si noe som en Listview (i .NET 3.5). deretter i Pageload etter postback traversere alle elementer i databound kontroll og bruke item.FindControl å komme på selve boksen.

Svarte 27/07/2009 kl. 21:03
kilden bruker

stemmer
0

Det jeg endte opp med å gjøre var merking alle mine IDer med en vet prefiks og stuffing dette på toppen av Form_Load:

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

alt annet synes å kjøre for sent.

Svarte 23/08/2009 kl. 22:05
kilden bruker

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