Как программно создать кнопку внутри DetailsView и присвоить ей имя CommandName? - PullRequest
0 голосов
/ 20 октября 2011

В DetailsView я создаю кнопку удаления программно и присваиваю ей CommandName. Кнопка создается нормально, когда я тестирую свое приложение, но когда я нажимаю кнопку удаления, ничего не происходит. Если я регулярно создаю точно такую ​​же кнопку с тем же CommandName в DetailsView, она отлично работает и корректно запускает ItemCommand DetailsView. Это означает, что что-то не так с тем, как я создаю свою кнопку в коде, но я не могу понять, что это такое. Нужно ли указывать UniqueID или что-то подобное?

Вот мой код, который программно создает кнопку удаления, которая не работает:

Public Sub GetAttachments(ByVal requestID As Integer)
    Try
        Dim pnlAttachments As Panel = dtlApplication.FindControl("pnlAttachments")
        Dim btnDelete As New LinkButton
        btnDelete.Text = "delete"
        btnDelete.CssClass = "lblDeleteAttachment"
        btnDelete.CommandName = "DeleteAttachment"
        btnDelete.ID = "lnkDeleteAttachment"
        pnlAttachments.Controls.Add(btnDelete)
    Catch ex As Exception
        'notify user on screen
        lblGeneralError.Text = ex.ToString
        lblGeneralError.CssClass = "red"
    End Try
End Sub  

И если я регулярно создаю кнопку, она работает нормально:

<asp:LinkButton runat="server" ID="lnkDeleteAttachment" Text="delete" commandname="DeleteAttachment" CssClass="lblDeleteAttachment"></asp:LinkButton>

Вот вывод страницы для программно созданной кнопки, которая не работает:

<a id="MainContent_dtlApplication_lnkDeleteAttachment" href="javascript:__doPostBack('ctl00$MainContent$dtlApplication$lnkDeleteAttachment','')">delete</a>

А вот вывод страницы для регулярно создаваемой кнопки, которая работает:

<a id="MainContent_dtlApplication_lnkDeleteAttachment" href="javascript:__doPostBack('ctl00$MainContent$dtlApplication$lnkDeleteAttachment','')">delete</a>

Вы можете видеть, что они идентичны.

Примечание. Причина, по которой я создаю его программно, заключается в том, что в конечном итоге я собираюсь добавить несколько кнопок удаления в оператор For For, и в этот момент у меня не будет выбора, создавать ли его регулярно или нет. или программно.

Ответы [ 3 ]

1 голос
/ 20 октября 2011

Вам нужно добавить обработчик события onclick на каждую обратную передачу, если вы хотите, чтобы она запускалась.Мое предложение состоит в том, чтобы вы объявили его в своей разметке со свойством visible в false и просто сделали его видимым, когда вам нужно, чтобы он был видимым.Вам не придется иметь дело с подобными вещами, и элемент управления не будет отображаться в любом случае, если в какой-то момент не установлен видимым.

0 голосов
/ 20 октября 2011

Пожалуйста, обратитесь к коду.Я могу поймать команду кнопки в button1_Command.Однако вам нужно прикрепить обработчик событий - button1.Command + = button1_Command;

<asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="125px" OnItemCommand="DetailsView1_ItemCommand"
    OnDataBound="DetailsView1_DataBound" AllowPaging="true">
    <Fields>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Panel ID="Panel1" runat="server">
                </asp:Panel>
            </ItemTemplate>
        </asp:TemplateField>
    </Fields>
</asp:DetailsView>

public class Customer
{
    public int CustomerId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

private List<Customer> _customers;

public List<Customer> Customers
{
    get
    {
        if (_customers == null)
        {
            _customers = new List<Customer>();

            _customers.Add(new Customer {CustomerId = 1, FirstName = "Jon", LastName = "Doe"});
            _customers.Add(new Customer {CustomerId = 2, FirstName = "Mary", LastName = "Doe"});
            _customers.Add(new Customer {CustomerId = 3, FirstName = "Brian", LastName = "Newton"});
        }
        return _customers;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    DetailsView1.DataSource = Customers;
    DetailsView1.DataBind();
}

protected void DetailsView1_DataBound(object sender, EventArgs e)
{
    Panel panel1 = DetailsView1.FindControl("Panel1") as Panel;
    Button button1 = new Button();
    button1.Text = "Delete";
    button1.Command += button1_Command;
    button1.CommandName = "Delete";
    panel1.Controls.Add(button1);
}

void button1_Command(object sender, CommandEventArgs e)
{
    // Delete data here
}
0 голосов
/ 20 октября 2011

Возможно, мне проще создать кнопку в разметке, а затем скрыть или показать ее программным способом.

...