#jquery #asp.net #ajax #gridview #datatable
Вопрос:
Я хочу добавить кнопку в asp gridview с помощью datatable в asp.net
Вот мой код представления сетки,
<asp:GridView ID="gv_productdetail" runat="server" AutoGenerateColumns="false" CssClass="table table-bordered table-condensed">
<columns>
<asp:BoundField DataField="MortageID" HeaderText="Id" />
<asp:BoundField DataField="Type" HeaderText="Type" />
</columns>
</asp:GridView>
Теперь это представление сетки привязывается методом ajax. Вот код,
//Fill Product Grid
function FillProductGrid() {
//Display Product
var AcNo = document.getElementById('<%= txt_acno.ClientID%>').value;
var Data = JSON.stringify({ mortgageNo: MortgageNo, acNo: AcNo });
$.ajax({
url: "CustomerMortgage.aspx/GetProductList",
async: true,
type: "POST",
dataType: "json",
data: Data,
contentType: "application/json; charset=utf-8",
success: OnSuccess,
failure: function (response) {
alert(response.d);
},
error: function (response) {
alert(response.d);
}
});
}
function OnSuccess(response) {
$('#<%=gv_productdetail.ClientID%>').DataTable(
{
paging: false,
destroy: true,
bLengthChange: true,
lengthMenu: [[5, 10, -1], [5, 10, "All"]],
bFilter: true,
bSort: true,
bPaginate: true,
data: response.d,
columns: [{ 'data': 'ProductId' },
{ 'data': 'ProductType' }
});
};
Все данные привязываются префектно. Но теперь я хочу добавить кнопку также в каждый столбец, я попробовал asp:Поле шаблона, но это не работает.
Ответ №1:
Вы должны быть в состоянии просто нажать кнопку.
Ваша разметка будет выглядеть следующим образом:
<asp:GridView ID="gv_productdetail" runat="server" AutoGenerateColumns="false" CssClass="table table-bordered table-condensed">
<columns>
<asp:BoundField DataField="MortageID" HeaderText="Id" />
<asp:BoundField DataField="Type" HeaderText="Type" />
<asp:TemplateField HeaderText="View">
<ItemTemplate>
<asp:Button ID="cmdRowSel" runat="server" Text="Row Sel" />
</ItemTemplate>
</asp:TemplateField>
</columns>
</asp:GridView>
Однако, как правило, я не показываю PK базы данных «идентификатор» в результирующей сетке.
И совсем не ясно, каковы преимущества заполнения этой сетки вызовом ajax в отличие от кода, стоящего за этим. Вам все еще нужно было написать веб-метод, но с какой целью? Стоила ли вся эта дополнительная работа того? Вы не получите лучшей производительности.
но, извлекая данные из кода на стороне клиента, как вы собираетесь предотвратить скрытие идентификаторов PK базы данных? Вы ДЕЙСТВИТЕЛЬНО не хотите, чтобы клиентская сторона видела или КОГДА-ЛИБО имела эти значения идентификатора строки базы данных PK в браузере.
GV имеет встроенную функцию для решения вышеуказанной проблемы.
(Данные). Это означает, что идентификатор базы данных строк PK может оставаться скрытым и НИКОГДА НЕ отображаться в браузере на стороне клиента.
Итак, скажем, у меня есть список таких отелей, как этот:
<asp:GridView ID="gvHotels" runat="server" AutoGenerateColumns="false"
CssClass="table table-bordered "
DataKeyNames="ID" >
<columns>
<asp:BoundField DataField="HotelName" HeaderText="Hotel" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:BoundField DataField="Province" HeaderText="Province" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="View">
<ItemTemplate>
<asp:Button ID="cmdRowSel" runat="server" Text="Row Sel" CssClass="btn"
OnClick="cmdRowSel_Click"/>
</ItemTemplate>
</asp:TemplateField>
</columns>
</asp:GridView>
Хорошо, код для заполнения, но более важным является событие нажатия кнопки.
Итак, нам нужно заполнить этот код:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadGrid
End If
End Sub
Sub LoadGrid()
Dim strSQL As String =
"SELECT ID, HotelName, City, Province, Description FROM tblHotels ORDER BY HotelName"
Using con As New SqlConnection(My.Settings.TEST3)
Using cmdSQL As New SqlCommand(strSQL, con)
con.Open()
gvHotels.DataSource = cmdSQL.ExecuteReader
gvHotels.DataBind()
End Using
End Using
End Sub
теперь у нас есть это;
И посмотрите, как мало это было кода — супер просто.
Пока ничего не видно, но это событие нажатия кнопки? Теперь я могу получить щелчок по строке и, что более важно, получить идентификатор строки PK базы данных, но НИКОГДА не раскрывал его на стороне клиента. Таким образом, наш код кнопки щелчка в строке за этим:
Protected Sub cmdRowSel_Click(sender As Object, e As EventArgs)
Dim btn As Button = sender
Dim gRow As GridViewRow = btn.Parent.Parent
Debug.Print("Row click index = " amp; gRow.RowIndex)
Dim PkID As Integer = gvHotels.DataKeys(gRow.RowIndex).Item("ID")
Debug.Print("Row click PK ID = " amp; PkID)
End Sub
выход:
Row click index = 5
Row click PK ID = 72
Теперь выше очень допустимо, так как при использовании параметра DataKeys идентификатор строки PK никогда не требуется и не отображается на стороне клиента.
В любом случае, я просто думаю, что вам лучше использовать код на стороне сервера для заполнения этой сетки. Вы получаете НУЛЕВОЕ преимущество в производительности, но теряете возможность получать данные строк с помощью событий на стороне сервера, но более важным является использование значения строки базы данных PK и отсутствие необходимости отображать его или даже разрешать или предоставлять идентификатор строки базы данных PK или отправлять его клиенту.
в любом случае, простое добавление кнопки в настройку шаблона, как указано выше, должно работать даже для вашей настройки, но в результате нажатия кнопки в коде сзади не будет использоваться идентификатор базы данных PK, если у вас нет этой части кода на стороне клиента, а это означает, что идентификаторы базы данных теперь отправляются на сторону клиента, и, что еще хуже, серверная сторона кода кнопки не может получить их для сеток, заполненных ajax (если вы не вытащите и не включите идентификатор базы данных PK в эту сетку).
Комментарии:
1. Согласно тому, что я описываю в вопросе, только это поле asp:TemplateField в нем не работает. А также почему мы хотим видеть веб-метод в соответствии с тем, что я говорю, что все данные отображаются идеально, это означает, что веб-метод идеален, просто я хочу добавить одну кнопку в каждый столбец, которая является только частью дизайна.
2. Как уже было сказано, простое падение asp.net кнопка в таблице будет работать, но для этого вам нужно заполнить сетку кодом на стороне сервера, так как именно gridview/listview на стороне сервера в конечном итоге генерирует стандартный вывод таблицы HTML. Итак, я полагаю, вы могли бы написать код на стороне клиента, который заполняет эту таблицу, а ТАКЖЕ добавляет кнопку. Но это большая работа, когда ничего не требуется. У меня нет решения, так как я не рекомендую этого делать, и я не могу найти подходящий вариант использования для того, чтобы потратить на это такие деньги. Так что бросьте asp.net управление сервером и используйте некоторые настройки сетки на стороне клиента js