如何在这里正确使用数据中继器

本文关键字:数据 中继器 在这里 | 更新日期: 2023-09-27 18:27:07

我想为数据库中的每个员工重复相同的设计。它就像一张考勤表。我想要它如下,员工的照片,然后在它旁边,员工的名字,然后是一个带有项目名称的下拉菜单,然后是两个按钮:在场或不在场。

这是我迄今为止的代码:

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();
}

这里的问题是DropDown菜单没有得到员工分配的项目。其次,我无法区分按钮。我的意思是,当用户点击"现在"或"缺席"按钮时,我不知道这些按钮指的是哪个员工。我不太确定这是否是做我想做的事情的最佳方式。如果有其他想法,我将不胜感激。

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

如何在这里正确使用数据中继器

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

在那里,你有几个问题:

  1. 按钮。在绑定期间,将它们的"CommandArgument"设置为记录的唯一键(数据库ID,不管怎样)。只需使用'/>

  2. 对于项目列表,如果看起来您正在循环中继器的ItemDataBound事件中的每个员工记录,这可能不是您想要的。中继器为给定数据集中的每个记录生成一个固定的标记位。ItemCreated事件是在创建每个中继器项目时触发的,假设这是您将中继器本身绑定到的数据集,则每个员工一个中继器项目。我不知道您最初是如何绑定数据的,因此您在下面的代码中获取e.item.DataItem的行可能必须更改。还有,我有数据的部分。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(); }
    }