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

时间:2013-08-08 19:09:54

标签: c# asp.net repeater

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

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

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 个答案:

答案 0 :(得分:1)

我认为你大部分时间都在正确的轨道上。我假设您的转发器正在填充查询,其中包含您要显示的每个员工的记录。

在那里,你有几个问题:

  1. 按钮。在绑定期间将其“CommandArgument”设置为记录的唯一键(数据库ID,无论如何)。只需使用'/>

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

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

  5. 最后,为了指出它,您至少应该使用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(); }
    }