Jeg har en tabel der bliver genereret dynamisk i min codebehind. En af kolonnerne i denne tabel hedder slet og indeholde en søjle af checkboxes. Det er meningen at når brugeren trykker på en sådan checkbox skal en eventhandler i min codebehind kaldes således at jeg kan slette den pågældende række.
Eventhandleren bliver ikke kaldt når en checkboks bliver trykket...Jeg forstår ikke hvorfor. Der bliver lavet postback som der skal, men eventhandleren bliver altså ikke handlet.
Et ekstra spg. til dette er hvordan jeg får denne checkboks til at sende information om rækken den er en del af således at jeg ved hvilken række jeg skal slette fra tabellen. Altså det man i gamle dage ville gøre vha. querystrengen. -> &rowID=23 man vidste altså så at det var rowId 23 der skulle manipuleres.
Jeg er ikke helt med på hvordan jeg gør det i dotnet.
Den kode jeg har lavet er følgende:(Hvis jeg er uforståelig så sig det og jeg uddyber meget gerne.)
flg. simple eksempel virker fint (skrevet i VB - men kan sikkert bruges som inspiration)
Dim ddl As DropDownList = New System.Web.UI.WebControls.DropDownList
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Put user code to initialize the page here
ddl.ID = "MyDropdownList" ddl.AutoPostBack = True ddl.Items.Add("one") ddl.Items.Add("two") ddl.Items.Add("Three") ddl.EnableViewState = True AddHandler ddl.SelectedIndexChanged, AddressOf ddl_SelectedIndexChanged PlaceHolder1.Controls.Add(ddl) End Sub
Private Sub ddl_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Label1.Text = "du valgte item : " + ddl.SelectedValue.ToString End Sub
der er flere måder at løse det på. En af dem kunne være at lave en collection a checkboxes og iterere igennem denne i eventhandleren... F.eks.
Dim chk(1) As CheckBox
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Put user code to initialize the page here
Dim i As Integer For i = 0 To 1 chk(i) = New System.Web.UI.WebControls.CheckBox chk(i).AutoPostBack = True chk(i).Text = "Checkbox:" + i.ToString chk(i).ID = i.ToString AddHandler chk(i).CheckedChanged, AddressOf chk_CheckedChanged PlaceHolder1.Controls.Add(chk(i)) Next End Sub
Private Sub chk_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim i For i = 0 To chk.Length - 1 If chk(i).Checked Then Label1.Text = "du valgte checkbox : " + chk(i).ID End If Next End Sub
hmm ja...det ser ud som om det er noget jeg kan bruge....men jeg kan ikke få det til at virke helt.
Det ser ud som om det kræver 2 tryk på checkboksen før den bliver slettet. Det må have noget at gøre med at checkboksene ikke bliver oprettet på det rigtige tidspunkt....Jeg skal nok give flere point for jeg ved godt det går ud over spørgsmålets kanter. Men hvis i gad lige at prøve at kigge på hvad der evt. går galt.
Nu viser jeg hele code-behind for at give en bedre sammenhæng.
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); btnAddLines.Click+=new EventHandler(btnAddLines_Click); cmbSted.SelectedIndexChanged+=new EventHandler(cmbSted_SelectedIndexChanged); btnMakeOrder.Click+=new EventHandler(btnMakeOrder_Click); } #endregion
Forresten jeg valgte løsningen at tilføje en attribute som jeg bruger til at identificere checkboksen. Jeg ved ikke om det er en holdbar løsning...men det virker vidst :) hæhæ
Det jeg ikke fatter er at første gang sletboksen trykkes bliver rækken fjernet første gang. Men resten af rækkerne kræver 2 tryk, altså to serverroundtrips før denne bliver slettet. Jeg forstår det simpelthen ikke.
Det at den kræver 2 roundtrips kunne tyde på at din tabel ikke bliver opdateret når du sletter men først næste gang siden loader.
Sidder og kigger din kode igennem. Jeg ville nu foreslå at bruge et datagrid men det er selvfølgelig op til dig. Men kan ikke lige se hvorfor det virker første gang men så ikke mere.
Tror jeg er nød til at melde pas på nuværende tidspunkt kan ikke se hvorfor den gør som den gør.
Er sikkert et eller andet latterligt som er lige foran en :). Men som der er nu virker det som om at evented på checkboxen kun bliver sat til når updateLineTable bliver kaldt fra page_load men ikke fra chk_CheckedChanged.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.