在文本框中显示listview的值

时间:2011-08-01 02:47:25

标签: c# mysql visual-studio-2010 listview textbox

我正在Visual Studio 2010 C#和MySQL中创建一个应用程序,用户可以在其中添加,编辑和查看员工。我已经完成了添加和查看部分。但是我对编辑感到困惑。我在我的表单中有这个listView,它显示添加到数据库的所有员工。我想要的是,每当用户选择一个员工并单击编辑按钮时,我希望保存在数据库中的值显示在listView下面的相应文本框中。有人能告诉我怎么做这个吗?请

截图: enter image description here

listView的代码:

private void getEmployee()
    {
        listViewEmployee.Items.Clear();
        string cmd = "select employee_number, employee_lastname, employee_firstname, employee_middlename, employee_position, employee_datehired from employee";
        DBConn db = new DBConn();
        DataTable tbl = db.retrieveRecord(cmd);
        foreach (DataRow row in tbl.Rows)
        {
            ListViewItem lv = new ListViewItem(row[0].ToString());
            lv.SubItems.Add(row[1].ToString() + ", " + row[2].ToString() + " " + row[3].ToString());
            lv.SubItems.Add(row[4].ToString());
            lv.SubItems.Add(row[5].ToString());
            listViewEmployee.Items.Add(lv);
        }
    }

    private void textBoxSearchEmployee_TextChanged(object sender, EventArgs e)
    {
        string cmd = "SELECT employee_number, employee_lastname, employee_firstname, employee_middlename, employee_position, employee_datehired FROM employee where employee_lastname Like '" + textBoxSearchEmployee.Text + "%'";
        listViewEmployee.Items.Clear();
        DBConn db = new DBConn();
        DataTable tbl = db.retrieveRecord(cmd);
        foreach (DataRow row in tbl.Rows)
        {
            ListViewItem lv = new ListViewItem(row[0].ToString());
            lv.SubItems.Add(row[1].ToString() + ", " + row[2].ToString() + " " + row[3].ToString());
            lv.SubItems.Add(row[4].ToString());
            lv.SubItems.Add(row[5].ToString());
            listViewEmployee.Items.Add(lv);
        }
    }

2 个答案:

答案 0 :(得分:2)

当用户按下“编辑”按钮时......

  1. 检索所选员工
  2. 使用SELECT获取所选员工的信息
  3. 使用所选员工的信息填充文本框
  4. 例如,

    String employee = listViewEmployee.Text;
    String cmd = "SELECT * FROM employee WHERE employee_lastname='" + employee + "'";
    DBConn db = new DBConn();
    DataTable tbl = db.retrieveRecord(cmd);
    txtLastName.Text = tbl.Rows[0][0];
    // ... 
    // etc.
    

    注意:将值连接到SQL查询是一个坏主意,因为如果值是恶意的,则可以执行不同的查询。例如,如果employee的值为x' OR '1'='1; DROP TABLE employee; --或某些行,则可以删除employee表。解决这个问题的方法是使用Stored Procedures或参数化查询。

答案 1 :(得分:2)

在我看来,您只能填充listView

一些指示:

1)现在编写SQL语句的方式很容易SQL Injection。在SQL命令中使用参数,而不是直接将变量连接到查询。有关如何操作的示例,请参阅this question

2)根据您的其他相关数据的位置(即,如果您的数据库已规范化),您可能需要在查询中加入。

string sqlQuery = "SELECT * FROM employee 
JOIN other_employee_data_table on other_employee_data_table.employeeID = employee.ID
WHERE employee.employee_lastname LIKE @employee_lastname +'%'"

但是如果您的employee表包含所有数据,则无需进行连接。只需从该表中获取所有相关信息。

3)获得所需的所有信息后,只需阅读这些数据并将其分配到各自的领域即可。

伪代码:

using (MySqlConnection connection = new MySqlConnection(connectionString))
{
   connection.Open(); 
   MySqlCommand command = connection.CreateCommand();
   command.CommandText = sqlQuery;
   command.CommandType = System.Data.CommandType.Text;
   // add parameters in this line
   using (MySqlDataReader reader = command.ExecuteReader())
   {  
      while (reader.Read()) 
      {     
         // iterate in each row
         for (int i = 0; i < reader.FieldCount; i++)
         {
            // iterate each column using reader.GetValue(i)
         }
      }
   }
}