我想为数据库中的每位员工重复相同的设计。这就像一张考勤表。我希望它如下,员工的图片,然后在它旁边,员工的名字然后是一个带有项目名称的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菜单没有获得员工分配给的项目。其次,我无法区分按钮。我的意思是当用户点击当前或缺席按钮时,我不知道这些按钮所指的是哪个员工。我不太确定这是否是我想做的最佳方式。其他想法将不胜感激。
我正在使用中继器,因为我需要为每位员工重复相同的模式,我相信中继器是最好的选择。
答案 0 :(得分:1)
我认为你大部分时间都在正确的轨道上。我假设您的转发器正在填充查询,其中包含您要显示的每个员工的记录。
在那里,你有几个问题:
按钮。在绑定期间将其“CommandArgument”设置为记录的唯一键(数据库ID,无论如何)。只需使用'/>
对于项目列表,如果您正在循环遍历转发器的ItemDataBound事件中的每个员工记录,这可能不是您想要的。转发器为给定数据集中的每个记录生成固定的标记位。在创建每个转发器项时触发ItemCreated事件,每个员工一个RepeaterItem,假设您将转发器本身绑定到的数据集。我不知道你最初如何绑定数据,所以你在下面的代码中获取e.Item.DataItem的行可能必须改变。此外,我拥有data.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(); }
}