所以我将遗留应用程序从coldfusion移植到asp.net/c#。我的问题是,(我已经搜遍了它,但我可能没有正确写出我的问题以获得好的结果),是我想从我的第一个查询中获取结果,并执行第二个查询填写该栏目。
以下是我在coldfusion中的表现:
<cfquery name="p" datasource="db">
select * from table
</cfquery>
<cfloop query="p">
<tr>
<td>
<a href="page.cfm?id=#p.id#">#p.title#</a>
</td>
<td">
#p.category#
</td>
<td>
#CreateObject("component","/components.dao").getuser(p.userid).user_fullname()#
</td>
</tr>
</cfloop>
你会注意到我调用了一个组件和方法,我也从查询中发送了userid。此方法有另一个调用单独数据库的查询,并返回有关该用户的信息,在这种情况下是全名,而不仅仅是userid。这是我在asp.net/c#中遇到问题的地方,因为我创建了以下代码:
<asp:Repeater id="program_list" runat="server">
<ItemTemplate>
<tr>
<td>
<a href="page.aspx?id=<%# Eval("id") %>"><%# Eval("title") %></a>
</td>
<td>
<%# Eval("category") %>
</td>
<td>
<%# Eval("userid")%> (needs full name convert)
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
并在代码隐藏
中protected void Page_Load(object sender, EventArgs e)
{
try
{
DbConnection connection = new SqlConnection();
connection.ConnectionString = "***";
connection.Open();
SqlCommand cmd = (SqlCommand)connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM table";
SqlDataReader reader = null;
reader = cmd.ExecuteReader();
program_list.DataSource = reader;
program_list.DataBind();
reader.Close();
connection.Close();
}
catch (Exception ex)
{
Response.Write(ex);
}
}
正如您所看到的,它只执行第一部分,输出原始查询,但我不知道如何与该查询交互以便第二次为用户详细信息调用数据库。非常感谢任何想法,谢谢。
答案 0 :(得分:0)
您正在寻找ItemDataBound事件。您可以在该事件中执行查询并填充其他控件。
答案 1 :(得分:0)
所以你需要调用每行中继器的sql查询。你应该使用ItemDataBoundEvent,在这种情况下,你可以处理user_id行,并可以进行另一次查询。
例如
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
DataRowView drw = (DataRowView)e.Item.DataItem
String sql = String.Format("Select * FROM UserInfo WHERE user_id={0}", drw["user_id"]);
Label lblUserName = (Label) e.Item.FindControl("lblUserName");
lblUserName.Text = //WWhatever you get from query...
}