我正在寻找一个从数据库中显示“事件”的GridView,然后在最后一列中我想进行另一个数据库查找(对于每一行)以查看该事件是否已满。
如果未满,请显示单选按钮。如果是完整显示文本“完整”。
我认为这最好用OnRowDataBound事件完成,但可以使用一些帮助。
我可以看到如何更改asp标签文本但不显示单选按钮。
register.aspx:
<asp:GridView ID="GridView2" runat="server" DataSourceID="SqlDataSource2" AutoGenerateColumns=false CellPadding="5" HeaderStyle-BackColor="DarkGray" Width="450px" OnRowDataBound="GridView2_OnRowDataBound">
<Columns>
<asp:BoundField DataField="sessionDate" HeaderText="Date" DataFormatString="{0:D}" />
<asp:BoundField DataField="sessionTime" HeaderText="Time" />
<asp:BoundField DataField="site" HeaderText="Site" />
<asp:BoundField DataField="room" HeaderText="Room" DataFormatString="{0:D}" />
<asp:TemplateField HeaderText="">
<ItemTemplate>
<input type="radio" name="rdoSessionID" value='<%# Eval("ses_ID") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
<HeaderStyle BackColor="#99CCFF" />
</asp:GridView>
<br />
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:sqlConnection2 %>"
SelectCommand="SELECT * FROM dbo.sessions WHERE site LIKE @ses_site AND sessionDate = @ses_date ORDER BY sessionDate">
<SelectParameters>
<asp:SessionParameter name="ses_site" SessionField="ses_site" Type="String" />
<asp:SessionParameter name="ses_date" SessionField="ses_date" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
答案 0 :(得分:1)
有几种方法可以做到这一点。
您仍然需要为所有这三个解决方案重载OnRowDataBound事件。如果已满,则隐藏单选按钮,并确保在事件未满时可见。不同之处在于您从何处获取数据。
你想做:
1好评(活动清单) 每次事件的X次点击次数
或
1对于事件列表,如果每个事件都已满,则命中率很高。
如果您想要娱乐#3,请发布您的SQL查询,我们可以从那里开始。
OnRowDataBound事件的快速示例。
protected void MyGridView_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
CheckBox cbox = (CheckBox)e.Row.FindControl("chkBox");
// Do some funky logic
cbox.Visible = Event.HasRoom; //Boolean Propery
// Or
cbox.Visible = Convert.ToBoolean(DataBinder.Eval(e.Row.DataItem, "HasRoom").ToString());
}
}
更新1:
对于GridView,您可以使用
<ItemTemplate>
<asp:CheckBox runat="server" ID="Checkbox1" ToolTip=" Sign up For event " text="Event stuff" />
</ItemTemplate>
如果您想使用模板,请不要使用常规控件,请使用控件。
对于查询,您可以执行以下操作。我对你的桌子结构并不是100%肯定所以我按照通常的方式做到了:
表:会话(sess_id(PK),SessionDate,SessionTime,Site,Room) 表:注册人(注册人ID(PK),sess_id(FK到会话),UserID(注册用户的FK)
SELECT SessionDate, SessionTime, Site, Room, ses_ID,
(SELECT Count(ses_ID) FROM Registrants R WHERE R.Ses_ID= S.ses_Id) as [Registrants]
FROM dbo.Sessions s
答案 1 :(得分:1)
使用OnRowDataBound事件,如下所示:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
RadioButton radio = e.Row.FindControl("RadioButton1") as RadioButton;
if (radio != null)
{
radio.Visible = SomeCheckThatReturnsBoolean((int)GridView1.DataKeys[e.Row.RowIndex]["SomeID"]);
}
}
如果可能,您应该使用GridView结果返回数据,并将值存储在数据键中,这样您就可以执行以下操作:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
RadioButton radio = e.Row.FindControl("RadioButton1") as RadioButton;
if (radio != null)
{
radio.Visible = (bool)GridView1.DataKeys[e.Row.RowIndex]["SomeBooleanValue"];
}
}
编辑:根据您对@Ryan的评论,我认为您应该能够在查询中包含该标记。我根本不知道您的数据库,但您可以尝试使用派生表或子查询来获取注册人会话计数。这是一个粗略示例,用于解决:
SELECT ID,
ISNULL(Registrants.RegistrantCount, 0) RegistrantCount
...
FROM Table1 t1
LEFT OUTER JOIN (
SELECT ForeignKeyID,
COUNT(RegistrantID) RegistrantCount
FROM Registrants
GROUP BY ForeignKeyID
) Registrants
ON Registrants.ForeignKeyID = t1.ID