我有一个带有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个小时,我开始吓坏了。有什么暗示吗?马丁
答案 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;
}