Подтверждение с помощью данных при удалении строки в GridView запускается только тогда, когда данные являются числом или нулем - PullRequest
2 голосов
/ 19 января 2012

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

 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="ID" DataSourceID="SqlDataSource1">
        <Columns>
            <asp:TemplateField ShowHeader="False">
                <ItemTemplate>
                    <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" 
                        CommandName="Delete" Text="Delete"  OnClientClick='<%# "return ConfirmDel(" + Eval("Fname") + ");" %>'></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="Fname" HeaderText="Fname" SortExpression="Fname" />
        . . . .
</asp:GridView>

, и вот код JavaScript

 function ConfirmDel(fname) {
        return confirm('Are you sure to delete ' + fname);
 }

Я некоторое время искал похожий вопрос, но не нашел точного.

1 Ответ

1 голос
/ 20 января 2012

Это действительно выглядит хорошо. Единственное, о чем я могу думать, это то, что событие не срабатывает, когда Eval («Fname») оценивается как Null.

Я бы попробовал

OnClientClick='<%# "return xx(" + String.IsNullOrEmpty(Eval("Fname").ToString()) ? 
                                  "debug - is this firing" : Eval("Fname") + ");" %>'

Очевидно, удалите отладочное сообщение, которое у вас работает

Ваша функция xx также неверна - я предполагаю, что это просто ошибка вырезания и вставки

function xx(fname) {         
    return confirm('Are you sure to delete ' + fname); 
}

Примечание заканчивается }

И наконец - я бы действительно изменил имя xx на более описательное. Я уверен, что это всего лишь отладочный / демонстрационный код, поэтому извиняюсь за то, что указал наш Просто чтобы подписаться на других читателей действительно.

EDIT

Я думаю, что это оно

 OnClientClick="return xx('<%# Eval('Fname') %>');"

Обратите внимание на два дополнительных '. Вам нужно передать это как строку, в противном случае вы получите странные эффекты в зависимости от того, что входит. Я бы по-прежнему остерегался пустых значений, как и раньше

Также Eval находится не в том месте - вы оцениваете всю строку javascript, но вам просто нужно заполнить поле данных.

РЕДАКТИРОВАТЬ 2

Я пытаюсь описать выше, и это просто не работает. Если бы я был тобой, я бы отказался от идеи использовать eval для построения OnClientClick в разметке. Сделайте это с помощью кода в событии RowDataBound, используя метод FindControl, чтобы выбрать ссылку. Это определенно работает (честно)

Я думаю, это мое последнее слово, если честно. Удачи

Почти последнее слово - просто для полноты вот что я бы сделал

void detailsGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
         string foreName = DataBinder.Eval(e.Row.DataItem, "Fname").ToString();
         LinkButton lnkButton = e.Row.FindControl("lnkLinkID") as LinkButton;
         lnkButton.OnClientClick = "Delete message to " + foreName
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...