ASP.NET 2.0中带有条件单选按钮的GridView

时间:2011-09-09 16:16:29

标签: c# asp.net gridview

我正在寻找一个从数据库中显示“事件”的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>

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。

  1. 您可以在OnRowDataBound上执行此操作,如果您正在处理的项目是DataItem,请从当前行中获取所需的值,然后执行快速数据库查找
  2. 当您从数据库中获取结果集时,请对每个事件执行另一次查找。这样,当您的数据离开数据层/方法时,您已经拥有了所需的一切。
  3. 修改您的SQL查询以使用事件列表返回此信息。你已经知道了事件,你可以只有一个子查询来查询它是否已满(或注册的人数,以及允许的最大数量,以便你可以显示)。这样你只需要对数据库进行1次点击,它将为你节省大量的处理时间。 (我最喜欢的)
  4. 您仍然需要为所有这三个解决方案重载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