Vincent Maverick Durano
Я уступаю Originalgriff's take в отношении SQL-инъекции.
Вплоть до вашей проблемы, поскольку вы не указали, в какой строке взорвется ошибка, то я предполагаю, что в строке, где вы делаете FindControl
или доступ к Controls
коллекция.
При обращении к Server Control
от GridView
, то вы можете либо использовать FindControl
или Controls
коллекция точно такая же, как у вас сейчас. Но имейте в виду, что у них есть определенная цель. Как правило, вы используете FindControl
метод, когда ваш серверный элемент управления находится с TemplateField
колонка. И вы, как правило, используете Controls[index]
когда вы используете a BoundField
колонка.
К примеру, давайте поставим в GridView
который покажет 2 столбца данных, как показано ниже:
<asp:GridView ID="GridViewEmployee" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField HeaderText="Employee Name">
<EditItemTemplate>
<asp:TextBox ID="TextBoxEditEmployee" runat="server" Text='<%# Bind("Employees") %>'/>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="LabelEmployee" runat="server" Text='<%# Bind("Employees") %>'/>
</ItemTemplate>
</asp:TemplateField >
<asp:TemplateField HeaderText="Position">
<EditItemTemplate>
<asp:TextBox ID="TextBoxEditPosition" runat="server" Text='<%# Bind("Position") %>'/>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="LabelPosition" runat="server" Text='<%# Bind("Position") %>'/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Теперь, если вы хотите получить доступ к значениям
TextBox
выше по адресу
RowUpdating
событие, вы могли бы сделать что-то вроде этого:
protected void GridViewEmployee_RowUpdating(object sender, GridViewUpdateEventArgs e){
//Accessing Edited values from the GridView
string employee = ((TextBox)GridViewEmployee.Rows[e.RowIndex].Cells[0].FindControl("TextBoxEditEmployee")).Text; //Employee
string position = ((TextBox)GridViewEmployee.Rows[e.RowIndex].Cells[1].FindControl("TextBoxEditPosition")).Text; //Position
// Your Update code here
// Do database changes
GridViewEmployee.EditIndex = -1; //Turn the Grid back to read only mode
BindGridView(); // Rebind GridView to reflect changes made
}
Заметил, что мы ссылаемся на
Control
с помощью
Cells[0].FindControl("TextBoxEditEmployee")
Это указывает на то, что мы смотрим на первый столбец таблицы.
GridView
с помощью ссылки
Cells[0]
Индекс столбца GridView всегда будет начинаться с нуля. Затем мы находим контроль, который мы хотим внутри этого
Column
с помощью
FindControl("TextBoxEditEmployee")
. Этот
ID
серверный элемент управления должен совпадать с тем, который вы передаете в серверный элемент управления.
FindControl
метод, иначе он будет бросать
Null Reference Exception
.
Доступ к элементу управления из
BoundField
Колонка-это другое. Например, если у нас есть такая разметка GridView:
<asp:GridView ID="GridViewEmployee" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="Employees" HeaderText="Name"/>
<asp:BoundField DataField="Position" HeaderText="Position"/>
</Columns>
</asp:GridView>
Чтобы получить доступ к отредактированным значениям в событии RowUpdating, вы можете сделать что-то вроде этого:
protected void GridViewEmployee_RowUpdating(object sender, GridViewUpdateEventArgs e){
//Accessing Edited values from the GridView
string employee = ((TextBox)GridView1.Rows[e.RowIndex].Cells[0].Controls[0]).Text;
string position = ((TextBox)GridView1.Rows[e.RowIndex].Cells[1].Controls[0]).Text;
// Your Update code here
// Do database changes
GridViewEmployee.EditIndex = -1; //Turn the Grid back to read only mode
BindGridView(); // Rebind GridView to reflect changes made
}
Заметили, что мы сейчас пользуемся
Cells[0].Controls[0]
получить ссылку на созданный
Server Control
Это указывает на то, что мы смотрим на первый
Column
из
GridView
с помощью ссылки
Cells[0]
... и когда мы найдем в нем тот контроль, который нам нужен
Column
с помощью
Controls[0]
что такое автоматически сгенерированное редактирование
TextBox
.
Здесь следует иметь в виду, что вы должны указать правильный индекс ячеек при доступе к элементу управления из
GridView
, в противном случае он будет бросать
Null Reference Exception
.
Если у вас есть
type cast error
, то, возможно, это связано с несоответствием типа данных вашей базы данных. Другими словами, вы проходите через
string
тип, который исходит от вашего
TextBox
/
Label
К
integer
введите в свою базу данных. Например, в вашем SQL
Where Clause
вы используете
id
что может быть
int
введите из своей базы данных, но вы передавали
Label.Text
ценность для него, которая является
string
Вы должны проверить каждый тип, которому вы передаете значения, и исправить это, а также рассмотреть возможность использования параметризованного запроса, как это было предложено, чтобы избежать
Атака Sql-инъекций.