RowDataBound没有按照我的预期行事

时间:2016-08-26 00:44:02

标签: c# asp.net gridview

我有一个带有ImageButton的Gridview,它应该仅对所选行可见。我在OnRowDataBound事件中执行此操作,但它无法正常工作。

protected void OnRowDataBoundMS(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        if ((e.Row.RowState & DataControlRowState.Edit) > 0)
        {
            // some working code that handles the edit mode
        }
        else if (Gridview1.SelectedValue != null)
        {
            ImageButton ImgBut1 = e.Row.FindControl("ButtonUp") as ImageButton;
            ImgBut1.Visible = true;
        }
    }
}

我的gridview看起来像这样:

    <asp:GridView runat="server"
                  ID="Gridview1"
                  DataSourceID="Milestones"
                  DataKeyNames="ID"
                  AutoGenerateColumns="false"
                  OnRowEditing="OnRowEditing"
                  OnRowDataBound="OnRowDataBoundMS"
                  OnSelectedIndexChanged="OnSelectedIndexChangedMS">
    ...
        <asp:templatefield HeaderText="Order" ItemStyle-HorizontalAlign="center">
            <ItemTemplate>
                <asp:ImageButton ID="ButtonUp" runat="server" OnClick ="OrderUp"  ImageUrl="img/up.png" Visible="false"/>
            </ItemTemplate>
        </asp:templatefield>

我花了最后3个小时,我开始吓坏了。有什么暗示吗?马丁

3 个答案:

答案 0 :(得分:2)

您可以使用RowDataBound属性检测RowState事件处理程序中的选定行,与检测编辑行的方式相同:

if ((e.Row.RowState & DataControlRowState.Selected) != 0)
{
    ...
}

另一种方法是使用数据绑定表达式在标记中设置ImageButton的Visible属性:

<asp:ImageButton runat="server" Visible='<%# ((Container as GridViewRow).RowState & DataControlRowState.Selected) != 0 %>' ... />

注意:请确保在GridView1.DataBind()事件处理程序中调用SelectedIndexChanged,以刷新GridView的内容。

答案 1 :(得分:2)

另一种方法是使用SelectedIndexChanged event,如果您使用的是选择命令选项:

protected void OnSelectedIndexChangedMS(object sender, EventArgs e)
{
    foreach (GridViewRow row in GridView1.Rows)
    {
        Control ctl = row.FindControl("ButtonUp");
        ctl.Visible = (row.RowState & DataControlRowState.Selected) != 0;
    }
}

这样的事情; RowDataBound可能会在所选索引更新之前触发(不确定...)。

答案 2 :(得分:0)

我想关键评论是Brian Mains在所选索引更新之前就RowDataBound激发所说的内容。我不能证明这一般是正确的,但似乎是这样。因此,所有尝试,即使遵循ConnersFan的建议也没有成功。我做了Brian建议的并使用了SelectedIndexChanged事件处理程序,但没有循环遍历所有行。解决方案实际上非常简单:

protected void OnSelectedIndexChangedMS(object sender, EventArgs e)
{
    Gridview1.DataBind();
    ImageButton ImgBut1 = Gridview1.SelectedRow.FindControl("ButtonUp") as ImageButton;
    ImgBut1.Visible = true;
}