2016-12-14 2 views
0

Latest error 私は現在Visual Studioを使用してC#でasp.net Webアプリケーションを作成しています。私は、データベーステーブルからデータを表示するgridviewを持っています。私は子供のDOBを年齢に変換したので、年齢グループのドロップダウンリストでgridviewをフィルタリングすることができるように、私の.csページに手動でデータソースを追加しました。これはすべて正常に動作し、私は唯一の問題は、リンクの削除ボタンを動作させることです。クリックすると、データベーステーブルから子を完全に削除する必要があります。グリッドビューの削除リンクボタンが表示されません

デザインモードで新しい列を追加 - >ボタンフィールド(ボタンタイプ 'リンク'、コマンド名 '削除')を開始し、次に.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ページからコードだけでなく、私が含まれますソースコード。誰かが私がなぜエラーを受けているのか、なぜ削除ボタンが問題なく削除されないのか理解できますか?前もって感謝します。

FULL .CSのCODE:

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

。 –

+0

ソースコードまたは.csページにありますか? .csコードを持たないデータソースに自動的に接続するときに削除機能を使用したことがあります。 – ACostea

+0

ここに 'LinkBut​​ton lnkRemove =(LinkBut​​ton)sender;送信者はGridViewではないlinkbutton – Sankar

答えて

0

senderは、ボタンではなくRowDeletingGridViewです。キャストは失敗します。

、指定したい場合DataKeyNamesあなたはGridViewのDataKeysプロパティを使用できます。

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

分離コード:あなたも、ボタンフィールドに `CommandArgument`を割り当てていない

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

Timさん、ありがとうございます。ソリューションを実装しようとしていますが、GridView1.DataSource = GetDataSource();行の 'GetDataSource'の下にエラーが表示されています。 //それを返すメソッドを提供します。 'GetDataSource'をどのような方法で置き換える必要がありますか?ありがとう。 – ACostea

+0

私は上記のように、それを返すメソッドはちょうど 'ソース'です – ACostea

+0

@ACostea:はい、私はこのためのフィールドを使用して好きではない、私は方法でそれをカプセル化するだろうが、はい –

0

さて、あなたは、GridViewの削除イベントではなく、ボタンのクリックを処理しています。送信者は実際にはGridViewコントロールですので、LinkBut​​tonにキャストしないでください。

さらに、CommandArgumentを割り当てていません。そのようなものでなければなりません:

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

しかし、あなたがした場合でも、これはCommandArgumentを削除しても引数と一緒に渡されないよう手助けするつもりはありません。したがって、2つの選択肢があります。

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

第二には、次のとおりです。削除し、そのコマンドが実際に削除1で確認して、コマンドの引数を使用する必要があって

OnRowDeleting="GridView1_RowCommand" 

まずRowCommandイベントを処理するに切り替えることです行の主キーを定義します。

DataKeyNames="childID" 

これは、イベントを削除するイベント引数を介して利用可能になるだろう:

e.Keys 

あなたはこのケースでは全くCommandArgumentを設定する必要はありません。

関連する問題