Hej, Finns det nån speciell anledning till att du inte binder dig mot t.ex. en DataGrid eller en Repeater eller nåt liknande? Och därifrån använder dig av OnItemCommand-funktionen? Ja, det finns det... Jag skulle nog ändå rekommendera dig att kolla på en repeater, som kan ses som att du loopar igenom ditt dataset och skapar rad för rad, utan att repeatern i sin tur skapar tabellrader, celler m.m. utan det får du skapa helt själv. Du är inte störig!! OK, ett förslag... Blev tyvärr inga repeaters utan DataGrids... Kopiera koden som den ser ut så hoppas jag att det ska funka för dig... Insåg att jag hade blandat lite väl mkt Table och Datagrid och sånt så här kommer en ny Datagrid Martin, Inga problem... Inser att jag kanske skrev ner allt lite väl fort så om du vill ha nåt förklarat så är det bara att du hör av dig... Sen går det så klart lösa på andra sätt också men det här var ett exempel iaf...Komma åt onClick-eventet från dynamisk button
Jag loopar igenom ett dataset och bygger en asp-tabell dynamiskt.
För varje varv i loopen bygger jag tabellceller och lägger in en button, btnAddUser.
Hur kommer jag åt Click-eventet för knapparna i varje rad ochhur skriver jag för att anropa eventet??
Så här ser den delen av koden ut:
'Button
Dim btnAddUser As System.Web.UI.WebControls.Button
'ASP TableRow object
Dim newRow As System.Web.UI.WebControls.TableRow
'ASP TableCell object
Dim newColumn As System.Web.UI.WebControls.TableCell
For Each tdrDepartment In dvDepartment.Table.Select("STATUS = 'ACTIVE'")
'Create new row
newRow = New System.Web.UI.WebControls.TableRow
newRow.EnableViewState = True
newRow.Enabled = True
'Create new column and set buttons
newColumn = New System.Web.UI.WebControls.TableCell
newColumn.Width = New Unit(30)
btnAddUser = New System.Web.UI.WebControls.Button
btnAddUser.CssClass = "buttons"
btnAddUser.Attributes.Add("Value", tdrDepartment.OBJECTID)
btnAddUser.Text = "Remove"
newColumn.Controls.Add(btnAddUser)
btnAddUser = Nothing
'Add column to row
newRow.Cells.Add(newColumn)
'Add row to table
tblDepartments.Rows.Add(newRow)
'Set column object to nothing
newColumn = Nothing
'Set row object to nothing
newRow = Nothing
Next
Lite hjälp please..!
/Jocke
Sv: Komma åt onClick-eventet från dynamisk button
Sv:Komma åt onClick-eventet från dynamisk button
Inne i tabellen kommer jag att göra en mängd andra saker, så detta är en liten del.
Då kändes det enklare att bygga tabellen själv än att börja grotta ner sig i datagrids. Om jag bara kan komma åt click-eventet, vill säga...:)
/JockeSv: Komma åt onClick-eventet från dynamisk button
Får man då fråga dig vad det är för mängd av saker du ska göra i tabellen som inte skulle gå att göra i en repeater? Ursäkta om jag är lite störig kanske... Sv:Komma åt onClick-eventet från dynamisk button
Det är lite synd att man inte kan ladda upp filer hit, då kunde jag visa dig.
Jag gör så här:
Jag klistrar in lite ren html kod, som du kan kopiera och klistra in i en text fil, så kan du kolla hur det är tänkt. Om du har tid o lust förstås!
Kolumnen till vänster visar olika avdelningar. Kolumnen i mitten visar valda namn för en avdelning. Framför varje namn är det ett kryss, klickar man på det skall användaren tas bort.
Nästa kolumn kommer knappen.
Med den skall man lägga till ett nytt namn till avdelningen. Man markerar ett, eller flera namn i listboxen längst till höger och klickar på knappen. Då skall namnen man valt läggas till.
Är du med?
Här kommer koden:
<code>
<html>
<head>
</head>
<body>
<table width="700">
<tr>
<td valign="top" width="500">
<table border="1" width="500">
<tr>
<td valign="top" width="220">Molecular Pharmacology</td>
<td valign="top" width="230">X Joachim Feldt<br>X Kalle Svensson<br>X Stina Johansson</td>
<td valign="top" width="50"><input type="button" value="<<"></td>
</tr>
<tr>
<td valign="top">Molecular Sciences</td>
<td valign="top">X Joachim Feldt<br>X Kalle Svensson<br>X Stina Johansson</td>
<td valign="top"><input type="button" value="<<"></td>
</tr>
<tr>
<td valign="top">Medicinal Chemistry</td>
<td valign="top">X Joachim Feldt<br>X Kalle Svensson<br>X Stina Johansson</td>
<td valign="top"><input type="button" value="<<"></td>
</tr>
<tr>
<td valign="top">Discovery Informatics</td>
<td valign="top">X Joachim Feldt<br>X Kalle Svensson<br>X Stina Johansson</td>
<td valign="top"><input type="button" value="<<"></td>
</tr>
<tr>
<td valign="top">Integrative Pharmacology</td>
<td valign="top">X Joachim Feldt<br>X Kalle Svensson<br>X Stina Johansson</td>
<td valign="top"><input type="button" value="<<"></td>
</tr>
</table>
</td>
<td valign="top" width="200">
<select size="10" name="lj">
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
<option>Kalle Jönsson></option>
</select>
</td>
</tr>
</table>
</body>
</html>
</code>
Har du någon bra annan lösning så gärna för mig...:)
Tack för hjälpen så länge!!
/JockeSv: Komma åt onClick-eventet från dynamisk button
ASPX-koden:
<code>
<table>
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" ShowHeader="False">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<tr>
<td valign="top">
<%#Container.DataItem("name")%>
</td>
<td valign="top">
<asp:DataGrid id="DataGrid2" runat="server" DataSource='<%# Container.DataItem.Row.GetChildRows("company_user") %>' AutoGenerateColumns="False" ShowHeader="False">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:Linkbutton id="cmdDeleteUser" Runat="server" CommandName="DeleteUser" CommandArgument='<%#Container.DataItem("userid")%>' CausesValidation="False">X</asp:Linkbutton>
<%#Container.DataItem("name")%>
<br>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
</td>
<td>
<asp:LinkButton ID="addUsers" Runat="server" CommandName="AddUsers" CommandArgument='<%#Container.DataItem("Id")%>'>Add</asp:LinkButton>
</td>
</tr>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
</table>
<asp:label ID="lblMessage" Runat="server"></asp:label>
</code>
code behind... Kräver att du har dina avdelningar i en table och personerna i en annan, går det tror du? Här skapar jag i det här exemplet två olika DataTables som jag sen lägger in i ett DataSet, och skapar en relation mellan tabellerna, bara för att få exemplet att funka någorlunda.
<code>
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not Page.IsPostBack Then
Dim dt As DataTable = New DataTable("Nurshinghomes")
Dim col1 As New DataColumn("id")
Dim col2 As New DataColumn("name")
dt.Columns.Add(col1)
dt.Columns.Add(col2)
Dim newRow As DataRow
newRow = dt.NewRow()
newRow("id") = 1
newRow("name") = "Molecular Pharmacology"
dt.Rows.Add(newRow)
newRow = dt.NewRow()
newRow("id") = 2
newRow("name") = "Molecular Sciences"
dt.Rows.Add(newRow)
Dim dt2 As DataTable = New DataTable("people")
Dim col11 As New DataColumn("compid")
Dim col21 As New DataColumn("name")
Dim col31 As New DataColumn("userid")
dt2.Columns.Add(col11)
dt2.Columns.Add(col21)
dt2.Columns.Add(col31)
newRow = dt2.NewRow()
newRow("compid") = 1
newRow("name") = "Joachim Feldt"
newRow("userid") = 1
dt2.Rows.Add(newRow)
newRow = dt2.NewRow()
newRow("compid") = 1
newRow("name") = "Kalle Svensson"
newRow("userid") = 2
dt2.Rows.Add(newRow)
newRow = dt2.NewRow()
newRow("compid") = 1
newRow("name") = "Stina Johansson"
newRow("userid") = 3
dt2.Rows.Add(newRow)
newRow = dt2.NewRow()
newRow("compid") = 2
newRow("name") = "Joachim Feldt"
newRow("userid") = 4
dt2.Rows.Add(newRow)
newRow = dt2.NewRow()
newRow("compid") = 2
newRow("name") = "Kalle Svensson"
newRow("userid") = 5
dt2.Rows.Add(newRow)
newRow = dt2.NewRow()
newRow("compid") = 2
newRow("name") = "Stina Johansson"
newRow("userid") = 6
dt2.Rows.Add(newRow)
Dim ds As New DataSet
ds.Tables.Add(dt)
ds.Tables.Add(dt2)
ds.Relations.Add("company_user", ds.Tables(0).Columns("id"), _
ds.Tables(1).Columns("compid"))
DataGrid1.DataSource = ds.Tables(0)
DataGrid1.DataBind()
End If
End Sub
Private Sub DataGrid1_ItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGrid1.ItemCreated
If e.Item.ItemType = ListItemType.AlternatingItem OrElse _
e.Item.ItemType = ListItemType.Item Then
Dim cntrl2 As DataGrid = DirectCast(e.Item.Cells(0).FindControl("DataGrid2"), DataGrid)
AddHandler cntrl2.ItemCommand, AddressOf DataGrid1_ItemCommand
End If
End Sub
Private Sub DataGrid1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.ItemCommand
Select Case e.CommandName
Case "DeleteUser"
lblMessage.Text = "delete user " & e.CommandArgument
Case "AddUsers"
lblMessage.Text = "add users from list to company " & e.CommandArgument
End Select
End Sub
</code>Sv:Komma åt onClick-eventet från dynamisk button
<code>
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" ShowHeader="False">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<%#Container.DataItem("name")%>
</ItemTemplate>
</asp:templatecolumn>
<asp:TemplateColumn>
<ItemTemplate>
<asp:DataGrid id="DataGrid2" runat="server" DataSource='<%# Container.DataItem.Row.GetChildRows("company_user") %>' AutoGenerateColumns="False" ShowHeader="False">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:Linkbutton id="cmdDeleteUser" Runat="server" CommandName="DeleteUser" CommandArgument='<%#Container.DataItem("userid")%>' CausesValidation="False">X</asp:Linkbutton>
<%#Container.DataItem("name")%>
<br>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
</ItemTemplate>
</asp:templatecolumn>
<asp:TemplateColumn>
<ItemTemplate>
<asp:LinkButton ID="addUsers" Runat="server" CommandName="AddUsers" CommandArgument='<%#Container.DataItem("Id")%>'>Add</asp:LinkButton>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
</code>
Innebär att du får ändra en funktion Code Behind också:
<code>
Private Sub DataGrid1_ItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGrid1.ItemCreated
If e.Item.ItemType = ListItemType.AlternatingItem OrElse _
e.Item.ItemType = ListItemType.Item Then
Dim cntrl2 As DataGrid = DirectCast(e.Item.Cells(1).FindControl("DataGrid2"), DataGrid)
AddHandler cntrl2.ItemCommand, AddressOf DataGrid1_ItemCommand
End If
End Sub
</code>
Hoppas som sagt det är förståeligt, trots att du inte var så sugen på att grotta ner dig i DataGrids och sånt :-)Sv: Komma åt onClick-eventet från dynamisk button
Stort tack för att lägger ner tid på detta!!
Nu är jag hemma, så jag ska titta på det imorgon på jobbet.
/JockeSv:Komma åt onClick-eventet från dynamisk button