如何在这里正确使用数据中继器
本文关键字:数据 中继器 在这里 | 更新日期: 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菜单没有得到员工分配的项目。其次,我无法区分按钮。我的意思是,当用户点击"现在"或"缺席"按钮时,我不知道这些按钮指的是哪个员工。我不太确定这是否是做我想做的事情的最佳方式。如果有其他想法,我将不胜感激。
我使用中继器是因为我需要为每个员工重复相同的模式,我相信中继器是最好的选择。
我认为你基本上是在正确的轨道上。我假设您的中继器中填充了一个查询,其中包含要显示的每个员工的记录。
在那里,你有几个问题:
-
按钮。在绑定期间,将它们的"CommandArgument"设置为记录的唯一键(数据库ID,不管怎样)。只需使用'/>
-
对于项目列表,如果看起来您正在循环中继器的ItemDataBound事件中的每个员工记录,这可能不是您想要的。中继器为给定数据集中的每个记录生成一个固定的标记位。ItemCreated事件是在创建每个中继器项目时触发的,假设这是您将中继器本身绑定到的数据集,则每个员工一个中继器项目。我不知道您最初是如何绑定数据的,因此您在下面的代码中获取e.item.DataItem的行可能必须更改。还有,我有数据的部分。ID将在很大程度上取决于您最初如何填充中继器。这只是为了让你走上正轨。
-
此外,我不确定您对数据结构的控制程度,但如果这些记录上的唯一密钥要求您在WHERE条件中使用LIKE比较,则应尽可能重新评估该结构。在SQL的WHERE条件中使用like或UPPER/LOWER之类的东西将阻止索引的使用,并可能使此查询运行缓慢。
-
最后,为了指出这一点,您至少应该使用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(); } }