2016-12-14 1 views
0

Latest error В настоящее время я создаю веб-приложение asp.net на C# с помощью Visual Studio. У меня есть gridview, который отображает данные из таблицы базы данных, и я добавил источник данных вручную на моей странице .cs, так как я преобразовал дочернюю DOB в возраст, таким образом, позволяя мне фильтровать gridview с выпадающим списком возрастных групп. Все это прекрасно работает, единственная проблема, с которой я столкнулся, - это заставить кнопку удаления ссылки работать. Мне нужно, чтобы он полностью удалял дочерний элемент из таблицы базы данных, если щелкнуть.Я не могу получить кнопку удаления ссылки на gridview для работы

Я начал ходить в GridView в режиме разработки, добавить новый столбец -> поле Button (типа кнопки «ссылка», название команды «удалить»), а затем добавить следующий код в моей странице .cs:

protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
    { 
     LinkButton lnkRemove = (LinkButton)sender; 

     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "delete from children where " + 
     "[email protected]";   
     cmd.Parameters.Add("@childID", SqlDbType.VarChar).Value 
      = lnkRemove.CommandArgument; 
     GridView1.DataSource = source; 
     GridView1.DataBind(); 
    } 

Когда я запускаю страницу и нажмите удалить рядом с любым из детей, я получаю следующее сообщение об ошибке:

Error

Я буду включать полный код с моей страницы .cs, а также мой исходный код. Может кто-нибудь помочь мне выяснить, почему я получаю сообщение об ошибке и почему кнопки удаления не удаляются без проблем? Заранее спасибо.

ПОЛНЫЙ .cs КОД:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data; 
using System.Configuration; 
using System.Data.SqlClient; 


namespace Coursework 
{ 
public partial class Testy1 : System.Web.UI.Page 
{ 
    //create a datasource 
    SqlDataSource source = new SqlDataSource(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //always set some defaults for the sqldatasource 
     source.ID = "source1"; 
     source.ConnectionString = ConfigurationManager.ConnectionStrings["newregDBConnectionString"].ConnectionStr‌​ing; 
     source.SelectCommand = "SELECT firstname, dob, DATEDIFF(hour, dob, GETDATE())/8766 AS age FROM children ORDER BY age"; 

     if (!IsPostBack) 
     { 
      //bind the grid 
      GridView1.DataSource = source; 
      GridView1.DataBind(); 
     } 
    }  
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     //the new database query, now with where clause 
     source.SelectCommand = "SELECT firstname, dob, DATEDIFF(hour, dob, GETDATE())/8766 AS age FROM children WHERE (DATEDIFF(hour, dob, GETDATE())/8766 BETWEEN @start AND @end) ORDER BY age"; 

     //get the end age from the dropdown and cast as int 
     int end = Convert.ToInt32(DropDownList1.SelectedValue); 

     //get the start int for the filter 
     int start = end - 2; 

     //if the filter is resetted, make sure the query returns all ages 
     if (end == 5) 
     { 
      start = 5; 
      end = 99; 
     } 

     //replace the parameters in the query 
     source.SelectParameters.Add("start", start.ToString()); 
     source.SelectParameters.Add("end", end.ToString()); 

     //rebind the grid 
     GridView1.DataSource = source; 
     GridView1.DataBind(); 
    } 

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 
    { 

    } 

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
    { 
     LinkButton lnkRemove = (LinkButton)sender; 

     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "delete from children where " + 
     "[email protected]";   
     cmd.Parameters.Add("@childID", SqlDbType.VarChar).Value 
      = lnkRemove.CommandArgument; 
     GridView1.DataSource = source; 
     GridView1.DataBind(); 
    } 
} 

ИСХОДНЫЙ КОД:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Testy1.aspx.cs" Inherits="Coursework.Testy1" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 
    <p></p> 
    <p></p> 
    <p></p> 
    <p></p> 
    <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"> 
    <asp:ListItem Text="Filter age" Value="5"></asp:ListItem> 
    <asp:ListItem Text="5 - 7" Value="7"></asp:ListItem> 
    <asp:ListItem Text="8 - 10" Value="10"></asp:ListItem> 
    <asp:ListItem Text="11 - 13" Value="13"></asp:ListItem> 
    <asp:ListItem Text="14 - 16" Value="16"></asp:ListItem> 
    </asp:DropDownList> 
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" OnRowDeleting="GridView1_RowDeleting" > 
    <Columns> 
     <asp:TemplateField HeaderText="Name"> 
      <ItemTemplate> 
       <%# Eval("firstname") %> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="DOB"> 
      <ItemTemplate> 
       <%# Convert.ToDateTime(Eval("dob")).ToString("d MMMM yyyy") %> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Age"> 
      <ItemTemplate> 
       <%# Eval("age") %> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:ButtonField CommandName="Delete" Text="Delete" /> 
    </Columns> 
</asp:GridView> 
</asp:Content> 
+0

Вы даже не присвоен 'CommandArgument' на кнопку поля. –

+0

В исходном коде или на странице .cs? Я только когда-либо использовал функцию удаления при автоматическом подключении к источнику данных без кода .cs, поэтому я новичок в этом способе делать что-то! – ACostea

+0

здесь 'LinkButton lnkRemove = (LinkButton) sender;' sender - GridView not linkbutton – Sankar

ответ

0

sender является GridView в RowDeleting, а не на кнопке, поэтому ваш листинг не работает.

Если бы указать DataKeyNames можно использовать GridView в DataKeys свойство:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" 
      DataKeyNames = "childID" 
      OnRowDeleting="GridView1_RowDeleting" > 

Codebehind:

protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    string childId = GridView1.DataKeys[e.RowIndex].Value.ToString(); 
    string deleteSql = @"DELETE FROM Children 
         WHERE childID = @childID;"; 
    using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["newregDBConnectionString"].ConnectionStr‌​ing)) 
    using(var cmd = new SqlCommand(deleteSql, con)) 
    { 
     cmd.Parameters.Add("@childID", SqlDbType.VarChar).Value = childId; 
     con.Open(); 
     int deleted = cmd.ExecuteNonQuery(); 
    } 

    GridView1.DataSource = GetDataSource(); // provide a method that returns it 
    GridView1.DataBind(); 
} 
+0

Спасибо, Тим, я пытаюсь реализовать ваше решение, но получаю сообщение об ошибке в 'GetDataSource' на линии GridView1.DataSource = GetDataSource(); // предоставляем метод, который возвращает его. Какой метод мне понадобится для замены «GetDataSource»? Благодарю. – ACostea

+0

Хорошо, я понял, что, как и выше, метод, который возвращает его, является просто «источником» – ACostea

+0

@ACostea: да, мне не нравятся использование полей для этого, я бы инкапсулировал его в методе, но в конце это источник, yes –

0

Ну, вы регулируете Удаление события GridView, щелкните не кнопки. Таким образом, ваш отправитель на самом деле является элементом управления GridView, вы не должны передавать его в LinkButton.

Кроме того, вы не назначили CommandArgument. Должно быть что-то вроде этого:

<asp:ButtonField CommandName="Delete" Text="Delete" CommandArgument='<%# Eval("childID") %>' /> 

Но даже если вы сделали, это не будет помогать, как CommandArgument не передается вместе с Удалять даже аргументы. Таким образом, у вас есть два варианта.

Во-первых, чтобы переключиться на обработку RowCommand событие:

OnRowDeleting="GridView1_RowCommand" 

В то вам необходимо проверить, что команда на самом деле является удаление один, и использовать команду ARG для удаления:

if (e.CommandName == "Delete") 
{ 
    // parse e.CommandArgument and delete 
} 

Во-вторых, для определения первичных ключей для строк.

DataKeyNames="childID" 

Это будет доступно арг событий удаления события:

e.Keys 

Вам не нужно устанавливать CommandArgument вообще в этом случае.