Question

I have the following markup in an .aspx file:

<asp:Repeater ID="ListOfAssignments" runat="server" OnItemDataBound="ListOfAssignments_ItemDataBound">
    <ItemTemplate>

        <asp:Label ID="AssignmentID" runat="server" Text="Label"></asp:Label>
        <br />
        <asp:Label ID="PathToFile" runat="server" Text="Label"></asp:Label>
        <br />
        <asp:Button ID="RemoveAssignment" runat="server" Text="Remove" OnClick="RemoveAssignment_Click"/>

    </ItemTemplate>
</asp:Repeater>

There are two labels and a button in a fairly standard repeater control. The repeater is bound to a database, and populates the labels with records from the database.

Here's my problem: I have a click event for each button in the repeater. The RemoveAssignment_Click method is called when the user clicks any of the buttons. In the click event, I want to know the text of the two labels associated with whatever button the user clicked.

What I mean is, in this method:

protected void RemoveAssignment_Click(object sender, EventArgs e)
{
    //code goes here
}

I want to be able to know the text of the labels that are adjacent to the button that was clicked. How do I do that?

Was it helpful?

Solution

What you are looking for is the Button.OnCommand Method:

This allows you to create multiple Button controls on a Web page and programmatically determine which Button control is clicked.

So inside ListOfAssignments_ItemDataBound you'd assign the CommandArgument to the button, where the CommandArgument is the ID of the article to be deleted:

protected void ListOfAssignments_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Button delButton = e.Item.FindControl("RemoveAssignment") as Button;
        delButton.CommandArgument = //set to the value of AssignmentID
        //rest of your code
    }
}

And now your button should say to use your new OnCommand:

<asp:Button ID="RemoveAssignment" OnCommand="RemoveAssignment" runat="server" Text="Remove" />

And then you create the method:

protected void RemoveAssignment(object sender, CommandEventArgs e)
{
    int articleIDToDelete = 0;
    if (Int32.TryParse((string)e.CommandArgument, out articleIDToDelete))
    {
        //delete the article with an ID = articleIDToDelete
    }
}

OTHER TIPS

You can add CommandName and CommandArgument attributes to the button tag and use them as a hint. And then in your even handler you can do e.CommandName == "xxx" or e.CommandArgument == "xxx". You can also use CommandArgument to pass the actual strings. You just need to bind the data just like you would do with a label, text, etc:

<asp:Button ID="RemoveAssignment" runat="server" CommandArgument='<%#Eval("Label1")+","+ Eval("Label2")%>' Text="Remove" OnClick="RemoveAssignment_Click"/>

Then in the event handler you can do something like:

string[] args = e.CommandArgument.ToString().Split(new char[] {','});
string label1 = args[0];
string label2 = args[1];

This should get you going.

Hm, I know c# and wp but you should try to set a bool and use this logic: if it is false, repeat will continue and if it is true, it'll exit the repeat. try this:

bool exit;


void Button_Click(eventargs stuffy here)
{
exit = true,
}

void Repeat()
{
    if (exit == false)
    {
    Repeat();
    //Your code here
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top