Создание пользовательской кнопки редактирования в gridview с помощью ASP.NET?
Я пытаюсь создать пользовательскую кнопку редактирования для своего первого проекта. Чтобы суммировать содержимое моей таблицы, столбцы имеют такие данные:
Название Типа Изображения
Гитара Ibanez test1.jpg
Гитара Fender test2.jpg
Мне удалось отобразить таблицу вместе с кнопками редактирования,обновления и отмены. Но когда я пытаюсь изменить имя "Fender "на" Gibson", он выдает мне такую ошибку:не удается вставить значение NULL в столбец "type", таблица "BrandsDB.dbo.guitarBrands"; столбец не допускает нулей. Обновление не удается. Заявление было прекращено.
И самое странное, когда я снова запустил программу. Он обновляет, наконец, то, что я хотел, но ошибка перед этим-это проблема.
Название Типа Изображения
Гитара Ibanez test1.jpg
Гитара Гибсон test2.jpg
Что я уже пробовал:
Вот код для aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="id" DataSourceID="SqlDataSource1" OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating"> <Columns> <asp:TemplateField> <ItemTemplate> <asp:Button ID="Button1" runat="server" Text="Delete" OnClick="Button1_Click"/> </ItemTemplate> </asp:TemplateField> <asp:TemplateField> <ItemTemplate> <asp:Button ID="ButtonEdit" runat="server" Text="Edit" CommandName="Edit"/> </ItemTemplate> <EditItemTemplate> <asp:Button ID="ButtonUpdate" runat="server" Text="Update" CommandName="Update"/> <asp:Button ID="ButtonCancel" runat="server" Text="Cancel" CommandName="Cancel"/> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Type"> <ItemTemplate> <asp:Label ID="LabelType" runat="server" Text='<%# Eval("Type") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="txt_Type" runat="server" Text='<%# Eval("Type") %>'></asp:TextBox> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Name"> <ItemTemplate> <asp:Label ID="LabelName" runat="server" Text='<%# Eval("Name") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="txt_Name" runat="server" Text='<%# Eval("Name") %>'></asp:TextBox> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Image"> <ItemTemplate> <asp:Label ID="LabelImage" runat="server" Text='<%# Eval("Image") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="txt_Image" runat="server" Text='<%# Eval("Image") %>'></asp:TextBox> </EditItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> <br/> <asp:Label ID="lblId" runat="server" Text="Label"></asp:Label><br/> <asp:Label ID="lblName" runat="server" Text="Label"></asp:Label><br/> </form>
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { SqlConnection con1 = new SqlConnection(@"Data Source=Y560\SQLEXPRESS;Initial Catalog=BrandsDB;Integrated Security=True"); SqlCommand cmd, cmd1; DataSet ds, ds1; public _Default() { cmd1 = new SqlCommand(); ds1 = new DataSet(); } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { bindgridviewguitarbrands(); } } //Start of Gridview Code for Guitar Brands private void bindgridviewguitarbrands() { con1.Open(); cmd1.CommandText = "SELECT * FROM [guitarBrands]"; cmd1.Connection = con1; SqlDataAdapter da1 = new SqlDataAdapter(cmd1); da1.Fill(ds1); con1.Close(); GridView1.DataBind(); } protected void Button1_Click(object sender, EventArgs e) { Button btn = sender as Button; GridViewRow gridrow = btn.NamingContainer as GridViewRow; int id = Convert.ToInt32(GridView1.DataKeys[gridrow.RowIndex].Value.ToString()); string name = GridView1.Rows[gridrow.RowIndex].Cells[3].Text; lblId.Text = id.ToString(); lblName.Text = name; } // row edit event protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) { GridView1.EditIndex = e.NewEditIndex; bindgridviewguitarbrands(); } // row update event protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { // find student id of edit row string id = GridView1.DataKeys[e.RowIndex].Value.ToString(); // find updated values for update TextBox type = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txt_Type"); TextBox name = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txt_Name"); TextBox image = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txt_Image"); SqlCommand cmd1 = new SqlCommand("update guitarBrands set Type='" + type.Text + "', Name = '"+name.Text+"', Image = '"+image.Text+"' where ID = "+id, con1); con1.Open(); cmd1.ExecuteNonQuery(); con1.Close(); lblName.Text = name.ToString(); GridView1.EditIndex = -1; bindgridviewguitarbrands(); } // cancel row edit event protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { GridView1.EditIndex = -1; bindgridviewguitarbrands(); } }
Richard Deeming
Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]
BebeSaiyan
ладно спасибо я буду смотреть в него.