【发布时间】:2014-10-16 13:29:56
【问题描述】:
我的目标是根据请求参数在 gridview 中选择一行并打开一个 FormView
首先,我在 Page_Load 中获取我的参数:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string param_id = Request["id"];
if (!string.IsNullOrEmpty(param_id))
{
SelectRowByDataKeyValue(param_id);
}
}
}
基于这个tutorial我想在我的GridView(称为gvPrincipal)中获取相应的行并选择它:
public void SelectRowByDataKeyValue(string value)
{
gvPrincipal.DataBind();
int tmpSelectedIndex = 0;
int tmpPageIndex = 0;
for (int page = 0; page < gvPrincipal.PageCount; page++)
{
gvPrincipal.PageIndex = page;
gvPrincipal.DataBind();
for (int key = 0; key < gvPrincipal.DataKeys.Count; key++)
{
if (!string.IsNullOrEmpty(value) && value.Equals(Convert.ToString(gvPrincipal.DataKeys[key].Value)))
{
tmpSelectedIndex = key;
tmpPageIndex = page;
break;
}
}
}
gvPrincipal.PageIndex = tmpPageIndex;
gvPrincipal.SelectedIndex = tmpSelectedIndex;
gvPrincipal.SelectRow(tmpSelectedIndex);
}
问题 1:在此之后,找到值,gvPrincipal.SelectedIndex 是正确的,但 gvPrincipal.SelectedValue 大部分时间给我一个不同的值
protected void gvPrincipal_SelectedIndexChanged(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine(String.Format("Selected Index : {0}, SelectedValue : {1}", gvPrincipal.SelectedIndex, /*wrong value*/gvPrincipal.SelectedValue));
}
问题 2:在 GridView 中,页面索引按预期更新,但行没有更新(应该是彩色的)
此外,每一行都有一个 ImageButton:
<Columns>
...
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="ImgBtnDetail" runat="server"
CommandName="Select"
CausesValidation="False" ImageUrl="~/Images/icon_detail_16.gif"/>
</ItemTemplate>
</asp:TemplateField>
...
</Columns>
单击此按钮会引发 gvPrincipal_RowCommand(),它将 FormView 设置为只读模式并显示详细信息:
protected void gvPrincipal_RowCommand(object sender, GridViewCommandEventArgs e)
{
//displays infos
}
FormView 数据源使用 gvPrincipalValue 更新:
<asp:ObjectDataSource ID="odsfvPrincipalDetail" runat="server" TypeName="crm.dal"
SelectMethod="SelectElementById">
<SelectParameters>
<asp:ControlParameter ControlID="gvPrincipal" Name="id" PropertyName="SelectedValue" Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
我想在 SelectRowByDataKeyValue 中以编程方式触发相同的行为; 这是我的尝试:
public void SelectRowByDataKeyValue(string value)
{
...
GridViewRow row = gvPrincipal.SelectedRow;
ImageButton ImgBtnDetail = (ImageButton)row.FindControl("ImgBtnDetail");
CommandEventArgs args = new CommandEventArgs("Select", null);
gvPrincipal_RowCommand(this, new GridViewCommandEventArgs(row, ImgBtnDetail, args));
}
不幸的是什么都没发生
没有保持未选中的行是我最关心的问题,我该如何克服这个问题?
【问题讨论】: