2012-07-25 65 views
1

嗨,有人可以幫助我。我的目標是允許用戶刪除數據庫中稱爲「消息」的多行。如何刪除使用複選框在asp中繼器控制與按鈕?

通過選擇複選框,用戶可以在按下按鈕後刪除多行。

但是,當我使用下面的代碼沒有發生。有人能幫我看看我的代碼有什麼問題嗎?謝謝=)

源代碼

<%@ Page Title="" Language="C#" MasterPageFile="~/MainMasterPage.master" AutoEventWireup="true" CodeFile="Messages.aspx.cs" Inherits="Messages" %> 
<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.SqlClient" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> 

<SCRIPT runat="server"> 
private void Page_Load(object sender, System.EventArgs e) 
{ 
    String userLog = Session["loginuser"].ToString(); 
    if (!IsPostBack) 
    { 
     LoadData(); 


    } 
} 
public void LoadData() 
{ 
String userLog = Session["loginuser"].ToString(); 
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Messages WHERE receiver = '" + userLog + "'", 
    "server=19-20\\sqlexpress;database=mpsip;Integrated Security=SSPI"); 
DataTable table = new DataTable(); 
adapter.Fill(table); 
Repeater1.DataSource = table; 
Repeater1.DataBind(); 

PagedDataSource pds = new PagedDataSource(); 
pds.DataSource = table.DefaultView; 
pds.AllowPaging = true; 
pds.PageSize = 10; 

int currentPage; 

if (Request.QueryString["page"] != null) 
{ 
    currentPage = Int32.Parse(Request.QueryString["page"]); 
} 
else 
{ 
    currentPage = 1; 
} 

pds.CurrentPageIndex = currentPage - 1; 
Label1.Text = "Page " + currentPage + " of " + pds.PageCount; 

if (!pds.IsFirstPage) 
{ 
    linkPrev.NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (currentPage - 1); 
} 

if (!pds.IsLastPage) 
{ 
    linkNext.NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (currentPage + 1); 
} 

Repeater1.DataSource = pds; 
Repeater1.DataBind(); 

}

&nbsp;<asp:Repeater ID="Repeater1" runat="server"> 

      <itemtemplate> 
       <asp:CheckBox ID="CheckBox1" runat="server" /> 
      <b><%# DataBinder.Eval(Container.DataItem, "title") %></b> 

      <br>From UserID: <%# DataBinder.Eval(Container.DataItem, 
        "mlogin", "{0:d}") %> 
       <br /> 
       Date: <%# DataBinder.Eval(Container.DataItem, 
        "dateandtime", "{0:d}") %> 
       <br /> 
       MessageID: <%# DataBinder.Eval(Container.DataItem, 
        "messageID", "{0:d}") %> 
        <br /> 


     </itemtemplate> 
     <separatortemplate> 
      <hr> 
     </separatortemplate> 
     </asp:Repeater> 




     <br /> 
     <asp:HyperLink ID="linkPrev" runat="server">Previous Page</asp:HyperLink>&nbsp; 
     <asp:HyperLink ID="linkNext" runat="server">Next Page</asp:HyperLink> 

    <br /> 
    <asp:Button ID="Button7" runat="server" onclick="Button7_Click" 
    Text="Button" /> 
    <br /> 
    <br /> 
    <br /> 

    <asp:Label ID="Label1" runat="server"></asp:Label> 
    <br /> 
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" 
     Text="Compose Message" /> 
    <asp:Button ID="Button2" runat="server" onclick="Button2_Click" 
     Text="Sent Messages" /> 

</div> 

protected void Button7_Click(object sender, EventArgs e) 
{ 

    using (SqlConnection conn = new SqlConnection("Data Source=19-20\\sqlexpress;" + "Initial Catalog = mpsip; Integrated Security = SSPI")) 
    { 
     conn.Open(); 
     SqlCommand cmdDel = conn.CreateCommand(); 
     SqlTransaction transaction = conn.BeginTransaction("MyTransaction"); 
     cmdDel.Connection = conn; 
     cmdDel.Transaction = transaction; 
     try 
     { 
      for (int i = 0; i < Repeater1.Items.Count; i++) 
      { 
       //This assumes data type of messageID is integer, change (int) to the right type 
       cmdDel.CommandText = "delete from messages where messageID = '" + ((String)((DataRow)Repeater1.Items[i].DataItem)["messageID"]) + "'"; 
       cmdDel.ExecuteNonQuery(); 

       // Continue your code here 

      } 
      transaction.Commit(); 
     } 
     catch (Exception ex) 
     { 
      try 
      { 
       transaction.Rollback(); 
      } 
      catch (Exception ex1) 
      { 
       //TODO: write log 
      } 
     } 
    } 


} 

}

+0

添加的DataItem的.propertyName(即((消息)Repeater1.Items [I] .DataItem).messageID – Thinhbk 2012-07-25 04:34:24

回答

0
protected void Button7_Click(object sender, EventArgs e) 
{ 
    bool BindNeeded = false; 

    SqlConnection connDelete = new SqlConnection("Data Source=19-20\\sqlexpress;" + "Initial Catalog = mpsip; Integrated Security = SSPI"); 
    connDelete.Open(); 
    String mySQL; 


    try 
    { 

     for (int i = 0; i < Repeater1.Items.Count; i++) 
     { 
      CheckBox CheckBox1 = (CheckBox) 
      Repeater1.Items[i].FindControl("CheckBox1"); 
      if (((CheckBox)Repeater1.Items[i].FindControl("CheckBox1")).Checked) 
      { 

       //This assumes data type of messageID is integer, change (int) to the right type 
       CheckBox CheckBox = (CheckBox)Repeater1.Items[i].FindControl("CheckBox1"); 
       Literal litMessageId = (Literal)Repeater1.Items[i].FindControl("litMessageId"); 

       string messageId = litMessageId.Text; 
       mySQL = string.Format("delete from messages where messageID = '{0}'", messageId); 

       SqlCommand cmdDelete = new SqlCommand(mySQL, connDelete); 
       cmdDelete.ExecuteNonQuery(); 




       // Continue your code here 
      } 
      else 
      { 

      } 
     } 
      if (BindNeeded) 
      { 
       Repeater1.DataBind(); 
      } 
      else 
      { 
       Response.Redirect("Messages.aspx"); 
      } 

    } 
     catch 
    { 
     Response.Redirect("Messages.aspx"); 
    } 

} 
1

有一些你的代碼錯誤,在這行:

mysql = "delete from messages where messageID = '" + CheckBox1.Checked + "'"; 

它應該是:

mysql = "delete from messages where messageID = '" + ((YourClass)Repeater1.Items[i].DataItem).messageID + "'"; 

而且你應該使用SqlParameter而不將字符串。

此外,SqlCommand的未執行,你應該加入這一行:

cmdDel.ExecuteNonQuery(); 

而且你必須刪除消息後重新加載數據。

此外,您應該將SqlConnection對象初始化爲for循環,並使用SqlTransaction來管理事務。

using (SqlConnection conn = new SqlConnection("Data Source=19-20\\sqlexpress;" + "Initial Catalog = mpsip; Integrated Security = SSPI")) 
{  
    conn.Open(); 
    SqlCommand cmdDel = conn.CreateCommand(); 
    SqlTransaction transaction = conn.BeginTransaction("MyTransaction"); 
    cmdDel.Connection = conn; 
    cmdDel.Transaction = transaction; 
    try { 
     for (int i = 0; i < Repeater1.Items.Count; i++) 
     { 
     //This assumes data type of messageID is integer, change (int) to the right type 
     cmdDel.CommandText = "delete from messages where messageID = '" + ((int)((DataRow)Repeater1.Items[i].DataItem)["messageID"]) + "'"; 
     cmdDel.ExecuteNonQuery(); 

     // Continue your code here 

     } 
     transaction.Commit(); 
     //TODO: reload data here and binding to Repeater 
    } 
    catch(Exception ex) { 
     try { 
      transaction.Rollback(); 
     } 
     catch(Exception ex1) { 
      //TODO: write log 
     } 
    } 
} 
+0

非常感謝的答案!即時通訊現在要嘗試一下。 – user1550383 2012-07-25 04:00:45

+0

您好我試着你的答案但有一些我不明白的錯誤,你能幫我看看嗎?非常感謝你=) – user1550383 2012-07-26 01:49:37

+0

@ user1550383:什麼錯誤?我剛剛編輯了答案,請檢查。 – Thinhbk 2012-07-26 01:56:02

相關問題