1

我做了一个数据库应用程序。目前我有一个添加和删除功能,但现在我正在寻找更新功能的帮助。我已经在整个网站上搜索了答案,但我想没有运气。所以我想要的是,如果我单击 ListView 中的记录,它会自动显示在文本框中,以便我可以更改内容,并且当我单击“更新”按钮时,它必须更新记录。

帮助将不胜感激!

我的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)
    {

    }

}

}

4

2 回答 2

0

你为什么使用listview。你可以使用datagridview。你可以将数据库文件与datagridview绑定,这将创建更新、选择和插入命令本身。

于 2013-03-07T10:54:58.390 回答
0

我不明白你为什么不能这样做。在列表视图中更新项目相对容易。

您需要EditItemTemplate为您的 , 创建 ,ListView以便文本框出现在要编辑的行中。

你可以在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有一个按钮“ ”,并有两个按钮“ ”和“ ”,而不是用适当的那个。btnEditEditItemTemplatebtnUpdatebtnCancelCommandName

现在这里是您的活动:

物品编辑:

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

物品更新:

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();
于 2013-03-07T11:22:34.720 回答