2013-03-07 74 views
1

我已經做了一個數據庫應用程序。目前我有一個添加和刪除功能,但現在我正在尋找更新功能的幫助。我已經在本網站上搜索了一個答案,但我猜沒有運氣。所以我想要的是,如果我點擊ListView中的一條記錄,它會自動顯示在文本框中,以便我可以更改內容,並且當我單擊「更新」按鈕時,它必須更新記錄。更新數據通過listview和文本框sql server compact 4

幫助將非常感激!

我Form1的代碼

 public SqlCeConnection conn = new SqlCeConnection(@"Data Source=E:\Users\Ali\Documents\automail.sdf"); 





    ////////////////////////////////////Methodes//////////////////////////////////// 

    private void Populate() 
    { 
     SqlCeCommand cm = new SqlCeCommand("SELECT * FROM Emails ORDER BY principalID", conn); 
     listView1.Items.Clear(); 

     try 
     { 
      SqlCeDataReader dr = cm.ExecuteReader(); 

      while (dr.Read()) 
      { 
       ListViewItem it = new ListViewItem(dr["principalID"].ToString()); 
       it.SubItems.Add(dr["email"].ToString()); 
       it.SubItems.Add(dr["query"].ToString()); 
       it.SubItems.Add(dr["subject"].ToString()); 
       listView1.Items.Add(it);   
      } 

      dr.Close(); 
      dr.Dispose(); 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      Application.ExitThread(); 
     } 
    } 






    ////////////////////////////////////Methodes//////////////////////////////////// 

    // Insert button (for data insert) 
    private void button1_Click(object sender, EventArgs e) 
    { 
     if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text == "") 
     { 
      MessageBox.Show("Fill in all the information first!"); 
     } 
     else 
     { 
      SqlCeCommand cmd = new SqlCeCommand("INSERT INTO Emails(principalID, email, query, subject) VALUES(@principalID, @email, @query, @subject)", conn); 
      cmd.Connection = conn; 
      cmd.Parameters.AddWithValue("@principalID", textBox1.Text); 
      cmd.Parameters.AddWithValue("@query", textBox2.Text); 
      cmd.Parameters.AddWithValue("@email", textBox3.Text); 
      cmd.Parameters.AddWithValue("@subject", textBox4.Text); 
      try 
      { 
       int affectedrows = cmd.ExecuteNonQuery(); 
       if (affectedrows > 0) 
       { 
        Populate(); 
        MessageBox.Show("Email added successfully!");  
       } 
       else 
       { 
        MessageBox.Show("Failed to add email!"); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

     } 

    } 
    //if form shown update listview 
    private void Form1_Shown(object sender, EventArgs e) 
    { 
     try 
     { 
      conn.Open(); 
      Populate(); 
     } 

     catch (SqlCeException ex) 
     { 
      MessageBox.Show(ex.Message); 
      Application.ExitThread(); 
     } 

    } 
    //open form 2 and hide this 
    private void button2_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     Form2 form2 = new Form2(); 
     form2.Show(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 
    //if listview selected enable button, else disable 
    private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (listView1.SelectedItems.Count > 0) 
     { 
      button3.Enabled = true; 
     } 

     else 
     { 
      button3.Enabled = false; 
     } 

    } 

    private void button3_Click(object sender, EventArgs e) 
    { 

    } 
    //delete record button 
    private void button3_Click_1(object sender, EventArgs e) 
    { 
     if (listView1.SelectedItems.Count <= 0) 
     { 
      MessageBox.Show("Select a record!"); 
     } 
     else 
     { 
      for (int i = 0; i < listView1.SelectedItems.Count; i++) 
      { 
       SqlCeCommand cm = new SqlCeCommand("DELETE FROM Emails WHERE principalID = @principalID", conn); 
       cm.Parameters.AddWithValue("@principalID", listView1.SelectedItems[0].Text); 

       try 
       { 
        cm.ExecuteNonQuery(); 
        Populate(); 
       } 

       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 
      } 
     } 
    } 

    private void button2_Click_1(object sender, EventArgs e) 
    { 
     if (listView1.SelectedItems.Count > 0) 
     { 
      ListViewItem itm = listView1.SelectedItems[0]; 
      string principalid = itm.SubItems[0].Text; 
      string query = itm.SubItems[1].Text; 
      string email = itm.SubItems[2].Text; 

      Form2 form2 = new Form2(); 

      form2.Show(); 

      form2.PrincipalID = principalid; 
      form2.Query = query; 
      form2.Email = email; 

     } 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 

    } 

} 

}

回答

0

你爲什麼要使用listview.You可以使用datagridview的instead.You可以綁定datagridview的數據庫文件,該文件將創建更新,選擇和插入命令本身。

0

我不明白爲什麼你不能這樣做。在ListView中更新項目相對容易。

您需要爲您的ListView創建EditItemTemplate,以便文本框出現在要編輯的行中。

您可以在ItemEditing事件中處理此事件。 ,然後通過ItemUpdating事件ListView處理更新。下面

我張貼的樣本例如:它可以幫助你了:

創建您的ListView類似這樣的標記:

<asp:ListView ID="lvwTest" runat="server" OnItemDeleting="lvwTest_ItemDeleting" OnItemEditing="lvwTest_ItemEditing" 
      OnItemUpdating="lvwTest_ItemUpdating"> 
      <LayoutTemplate> 
       <table> 
        <tr> 
         <td> 
          Column1 
         </td> 
         <td> 
          Column2 
         </td> 
         <td> 
          Column3 
         </td> 
         <td> 
          Action 
         </td> 
        </tr> 
        <tr id="itemplaceholder" runat="server"> 
        </tr> 
       </table> 
      </LayoutTemplate> 
      <ItemTemplate> 
       <tr> 
        <td> 
         <asp:Label ID="lbl1" runat="server" Text='<%#Eval("col1") %>'></asp:Label> 
        </td> 
        <td> 
         <asp:Label ID="Label1" runat="server" Text='<%#Eval("col2") %>'></asp:Label> 
        </td> 
        <td> 
         <asp:Label ID="Label2" runat="server" Text='<%#Eval("col3") %>'></asp:Label> 
        </td> 
        <td> 
         <asp:Button ID="btnEdit" CommandName="Edit" runat="server" Text="Edit" /> 
        </td> 
       </tr> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <tr> 
        <td> 
         <asp:TextBox ID="txt1" runat="server" Text='<%#Bind("col1") %>'></asp:TextBox> 
        </td> 
        <td> 
         <asp:TextBox ID="txt2" runat="server" Text='<%#Bind("col2") %>'></asp:TextBox> 
        </td> 
        <td> 
         <asp:TextBox ID="txt3" runat="server" Text='<%#Bind("col3") %>'></asp:TextBox> 
        </td> 
        <td> 
         <asp:Button ID="btnUpdate" CommandName="Update" Text="Update" runat="server" /> 
         <asp:Button ID="btnCancel" CommandName="Cancel" Text="Cancel" runat="server" /> 
        </td> 
       </tr> 
      </EditItemTemplate> 
     </asp:ListView> 

所以基本上你創建EditItemTemplate

瞭解如何ItemTemplate在最後一欄按鈕「btnEdit」和EditItemTemplate有兩個按鈕「btnUpdate」和「btnCancel」,而不是與適當CommandName

現在,這裏是你的事件:

ItemEditing:

protected void lvwTest_ItemEditing(object sender, ListViewEditEventArgs e) 
{ 
      lvwTest.EditIndex = e.NewEditIndex; 
} 

ItemUpdating:

protected void lvwTest_ItemUpdating(object sender, ListViewUpdateEventArgs e) 
{ 
    TextBox txt = (lvwTest.Items[e.ItemIndex].FindControl("txt1")) as TextBox; 
    //as above find othe textboxes as well/ 

    //create your update query 
    //SqlCeCommand cmd = new SqlCeCommand(updateQuery, cn); 
    //and rest of the syntax 
    lvwTest.EditIndex = -1; 
    BindGrid(); 
} 

您的數據源:

public void BindGrid() 
     { 
      DataTable db = new DataTable(); 
      db.Columns.Add("col1"); 
      db.Columns.Add("col2"); 
      db.Columns.Add("col3"); 
      db.Rows.Add("1", "2", "3"); 
      db.Rows.Add("1", "2", "3"); 
      db.Rows.Add("1", "2", "3"); 


      lvwTest.DataSource = db; 
      lvwTest.DataBind(); 
     } 

內頁的Page_Load

if (!IsPostBack) 
     BindGrid(); 
+0

我真的沒有得到頂部的EditItemTemplate部分,您是否有示例網站?這個例子是 – 2013-03-07 16:02:55

+0

,直接複製粘貼代碼並運行。 EditItemTemplate類似於ItemTemplate,但它只有在調用「編輯」命令時纔會出現 – 2013-03-07 16:45:31