1

我想为数据库中的每个员工重复相同的设计。它就像一个考勤表。我希望它如下所示,员工的照片,然后是员工的姓名,然后是带有项目名称的下拉菜单,然后是两个按钮:存在或缺席。

到目前为止,这是我的代码:

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
  _connection.Open();
  OdbcCommand getempos = new OdbcCommand("SELECT ID, filepth from empos ", _connection);
  OdbcDataReader loopempos = getempos.ExecuteReader();

  while (loopempos.Read())
  {
    OdbcCommand findempros = new OdbcCommand("SELECT p.projName from projects p INNER JOIN assigns a ON p.projID = a.projname WHERE a.employeeID LIKE '" + loopempos["ID"].ToString() + "'", _connection);
    OdbcDataReader readit = findempros.ExecuteReader();

    while (readit.Read())
    {
      DropDownList mydblist = (DropDownList)e.Item.FindControl("DropDownList1");
      mydblist.Items.Add(readit["projName"].ToString());
    }

  }
  _connection.Close();
}

这里的问题是下拉菜单没有获取员工分配到的项目。其次,我无法区分按钮。我的意思是当用户点击出席或缺席按钮时,我不知道这些按钮指的是哪个员工。我不太确定这是否是做我想做的最好的方法。其他想法将不胜感激。

我使用中继器是因为我需要为每个员工重复相同的模式,我相信中继器是这里的最佳选择。

4

1 回答 1

1

我想,你基本上是在正确的轨道上。我假设您的转发器正在填充一个查询,其中包含您要显示的每个员工的记录。

在那里,你有几个问题:

  1. 纽扣。在绑定期间将它们的“CommandArgument”设置为记录的唯一键(数据库 ID 等)。只需使用' />

  2. 对于项目列表,如果看起来您正在遍历中继器的 ItemDataBound 事件中的每个员工记录,这可能不是您想要的。转发器为给定数据集中的每条记录生成固定位的标记。ItemCreated 事件在创建每个转发器项目时触发,假设这是您将转发器本身绑定到的数据集,则每个员工都有一个 RepeaterItem。我不知道您最初是如何绑定数据的,因此您在下面的代码中获取 e.Item.DataItem 的行可能必须更改。此外,我拥有 data.ID 的部分将非常取决于您首先如何填充中继器。这只是为了让你走上正确的轨道。

  3. 此外,我不确定您对数据结构的控制程度,但如果您对这些记录的唯一键要求您在 WHERE 条件下使用 LIKE 比较,则应尽可能重新评估该结构。在 SQL 的 WHERE 条件中使用 LIKE 或 UPPER/LOWER 之类的内容将阻止索引的使用,并可能使此查询运行缓慢。

  4. 最后,需要指出的是,您至少应该使用 Try-Finally 块来确保您的数据库连接被关闭。

    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        _connection.Open();
        try
        {
            DataItemTypeName data = (DataItemTypeName)e.Item.DataItem;
            if (data == null)
                // This is more of a debugging check, since I'm a little in the dark about data types and such here.
                throw new Exception("No data.");
    
            OdbcCommand findempros = new OdbcCommand("SELECT p.projName from projects p INNER JOIN assigns a ON p.projID = a.projname WHERE a.employeeID LIKE '" + data.ID + "'", _connection);
            OdbcDataReader readit = findempros.ExecuteReader();
    
            while (readit.Read())
            {
                DropDownList mydblist = (DropDownList)e.Item.FindControl("DropDownList1");
                mydblist.Items.Add(readit["projName"].ToString());
            }
        }
        finally
        { _connection.Close(); }
    }
    
于 2013-08-08T22:05:12.660 回答