ASP.Net ImageButton не стреляет по клику - PullRequest
3 голосов
/ 25 октября 2011

Я тестирую два элемента управления ImageButton, один из которых программно устанавливается внутри функции GridView_RowDataBound, а другой жестко задан на стороне клиента следующим образом:

Static ImageButton (работает и запускает ImageButton_Click):

<asp:ImageButton OnClick="ImageButton_Click" runat="server" ID="Foo" ImageUrl="images/edit-icon.png" />

Dynamic ImageButton (не работает, не запускает ImageButton_Click):

 protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
        {
.
.
.

    ImageButton i = new ImageButton();
                        i.ImageUrl = "/images/edit-icon.png";
                        i.ID = "icon_" + testID.ToString();
                        i.ToolTip = "Click to add a new comment";
                        i.Click += new ImageClickEventHandler(ImageButton_Click);
                        e.Row.Cells[5].Controls.Add(i);
.
.
.

    }

Dynamic ImageButton рендерится следующим образом

<input type="image" name="GridView1$ctl24$DGV1$ctl02$icon_1234" id="GridView1_ctl24_DGV1_ctl02icon_1234" title="Click to add a new comment" src="/images/edit-icon.png" onclick="ImageButton_Click;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;GridView1$ctl24$DGV1$ctl02$icon_1234&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" style="border-width:0px;">

Я замечаюКнопка динамического изображения содержит «onclick» против статической кнопки «image», которая имеет «OnClick», не уверен, что это имеет значение.Я был озадачен этим последние несколько часов, я не знаю, почему динамическая кнопка ImageButton не запускается.Пожалуйста, помогите.

ОБНОВЛЕНИЕ:

Спасибо за все отзывы, мне нужно только обработать идентификатор ImageButton, и он не должен быть на стороне сервера.В любом случае я могу сделать это со стороны клиента, используя JavaScript, чтобы избежать обратной передачи?Я попытался переконфигурировать ImageButton следующим образом:

                      ImageButton i = new ImageButton();
                    i.ImageUrl = "/images/edit-icon.png";
                    i.ID = "icon_" + testID.ToString();
                    i.ToolTip = "Click to add a new comment";
                    i.OnClientClick = "submitComment(i.ID);return false;";
                    e.Row.Cells[5].Controls.Add(i);

Я указываю эту функцию в заголовке моей веб-формы

       <head runat="server">
            <script type="text/javascript">
             submitComment(i.ID){
             //Call WebMethod and pass comment along with this button's testID
}
    </script>
        </head>

Но я получаю следующую ошибку, когда нажимаю на правку-icon ImageBtn:

Uncaught Reference Error: icon_12345 is not defined.

Как это так?Если значки редактирования уже отрисованы, и я просто использую Javascript на стороне клиента, разве они не должны быть уже определены и иметь возможность правильно ссылаться на них?Это кажется мне очень противоречивым.Я что-то здесь упускаю?Есть ли какой-то другой элемент управления, кроме ImageButton, который я могу использовать для рендеринга изображения, не беспокоясь о обратной передаче, но который все еще может вызывать Javascript и передавать его идентификатор?Как насчет использования обычного элемента управления Image и простого подключения его свойства onclick для вызова функции submitComment.

Ответы [ 4 ]

4 голосов
/ 25 октября 2011

Проблема в том, что при обратной передаче ASP.NET не запоминает, что вы динамически добавили элемент управления по предыдущему запросу.Элемент управления просто не существует в дереве элементов управления, поэтому событие не сработает.

Вы просите боли и страдания, пытаясь динамически добавлять элементы управления.Элемент управления должен быть воссоздан вами до Page_Load, если вы хотите, чтобы событие сработало.См. http://forums.asp.net/t/1186195.aspx/1 для получения более подробной информации.

Я бы просто скрыл ImageButton для строк, которые в нем не нуждаются.

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

Вы должны DataBind на каждой обратной передаче, чтобы вернуть элемент управления в ControlTree.

0 голосов
/ 10 апреля 2013

Если ваша страница маршрутизируется, просто добавьте этот код на главную страницу on_load или на страницу, где у вас есть форма

form1.Action = Request.Url.PathAndQuery;

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

Может быть, вы могли бы попробовать что-то подобное? Просто создайте обычный элемент img с выражением привязки данных для атрибута onclick. «ID» должен быть полем в источнике данных gridview.

<Columns>
    <asp:TemplateField>
        <ItemTemplate>
            <img src="/images/edit-icon.png" onclick="submitComment('<%# Eval("ID", "icon_{0}") %>');"></img>
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

Не проверено, но я использовал что-то подобное раньше. ASP.NET может получить разборчивый анализ выражения привязки данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...