【问题标题】:Simple databinding to gridview columns到 gridview 列的简单数据绑定
【发布时间】:2009-06-11 23:04:24
【问题描述】:

我有一个 GridView,用于向我的用户显示搜索结果。我想让他们在执行搜索时选择在 GridView 上显示哪些列。很简单,是吗?我想尝试使用只是数据绑定来做到这一点,没有事件。不幸的是,我的代码无法使用绑定到列的 Visible 属性的复选框来更新 GridView。复选框的状态发生变化,但列的 Visible 属性不变。

Search.aspx 的片段:

<myControl:FacultyGridView ID="FacultyGridView1" runat="server" />
    <asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
    <asp:CheckBox ID="CheckBox1" runat="server" Text='<%# Eval("HeaderText") %>' Checked='<%# Bind("Visible") %>' AutoPostBack=true/></ItemTemplate>
</asp:Repeater>

Search.aspx.cs 中的代码隐藏 sn-p:

protected void Page_Load(object sender, EventArgs e)
{
     Repeater1.DataSource = FacultyGridView1.GridView.Columns;
     Repeater1.DataBind();
}

明确地说,GridView 公开为名为 FacultyGridView 的用户控件的公共属性。 FacultyGridView.ascx的相关sn-p:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    AllowPaging="True" AllowSorting="True" PageSize="25">
    <PagerSettings Mode="NumericFirstLast" Position="TopAndBottom" />
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="Name" ReadOnly="True" SortExpression="Name" />
        <asp:TemplateField HeaderText="University" SortExpression="UniversityID">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Eval("University.Name") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Division">
            <ItemTemplate>
                <asp:Repeater ID="Repeater1" runat="server" DataSource='<%# Eval("DivisionMemberships") %>'>
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Eval("Division.Name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:Repeater>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Title" HeaderText="Title" ReadOnly="True" SortExpression="Title" />
        <asp:TemplateField HeaderText="Research Type">
            <ItemTemplate>
                <asp:Repeater ID="Repeater1" runat="server" DataSource='<%# Eval("ResearchTypeMappings") %>'>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("ResearchType.Name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:Repeater>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Expertise" HeaderText="Expertise" ReadOnly="True" SortExpression="Expertise" />
        <asp:HyperLinkField DataNavigateUrlFields="Website" DataTextField="Website" HeaderText="Website"
            SortExpression="Website" />
        <asp:BoundField DataField="Phone" HeaderText="Phone" ReadOnly="True" SortExpression="Phone" />
        <asp:TemplateField HeaderText="Email Address" SortExpression="EmailAddress">
            <ItemTemplate>
                <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("EmailAddress", "mailto:{0}") %>'
                    Text='<%# Eval("EmailAddress") %>'></asp:HyperLink>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

最后,我应该提到 GridView 由页面上的 Button 绑定,但无论我在数据绑定之前还是之后使用复选框,我都没有更新 Visible 属性。此外,使用 if(!IsPostBack) 在第一个 Page_Load() 上绑定转发器 only 时,我没有看到我想要的行为,也没有使用 Checkbox.AutoPostback true 或 false。关于我做错了什么的任何线索?我希望它是简单的东西,但我在这里有点绿色。

作为说明:我知道如何通过事件轻松地做到这一点,但我想通过数据绑定作为学习练习来做到这一点。

【问题讨论】:

  • 我认为在你的问题标题中使用“简单”这个词有点用词不当:-)
  • 看起来像一个简单的案例,但也许我的问题很罗嗦:)

标签: asp.net data-binding


【解决方案1】:

可能是因为每次将网格绑定到数据时,都会重新创建列和设置(无需您进行更改)。

【讨论】:

  • 这似乎并非如此。我只将 GridView 绑定到其数据一次,并且(如上所述),即使在数据绑定之后,复选框也不会更新 GridView 列。事实上,拦截 GridView 数据绑定事件表明,即使在此之前,列也没有更新。此外,如果我重新绑定到列,我会看到即使单击复选框,复选框也不会改变状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 2012-06-17
相关资源
最近更新 更多