【问题标题】:Get controls ClientID/UniqueID between DetailsView and UpdatePanel获取 DetailsView 和 UpdatePanel 之间的控件 ClientID/UniqueID
【发布时间】:2011-02-24 01:36:15
【问题描述】:

我想知道如何在 Detailsview 控件 EditItemTemplate 元素中获取控件的 ClientID/UniqueID,以及何时将 DetailsViews 更改为编辑模式并且 DetailsView 在 AJAX UpdatePanel 内。如果没有 UpdatePanel,在 PostBack 期间我可以获得 ClientID 的控制权,但现在有了 UpdatePanel。

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:DetailsView ID="DetailsView1" runat="server" DataSourceID="SqlDataSource1" AllowPaging="true" AutoGenerateEditButton="true">
                <Fields>
                    <asp:TemplateField>
                        <EditItemTemplate>
                            <asp:CheckBox runat="server" ID="chkboxTest" Text="CHECKBOX" />
                        </EditItemTemplate>
                    </asp:TemplateField>
                </Fields>
            </asp:DetailsView>
        </ContentTemplate>
    </asp:UpdatePanel>

如您所见,EditItemTemplate 包含一个 Checkbox 控件。因此,当 Detailsview 更改为编辑模式时,我试图获取此复选框的 ClientID。我需要这个值来处理 Javascript。

捕捉事件ChangingMode/ChangedMode 不起作用; chkbox 为空:

 void DetailsView1_ModeChanged(object sender, EventArgs e)
    {
        if (DetailsView1.CurrentMode == DetailsViewMode.Edit)
        {
            var chkbox = DetailsView1.FindControl("chkboxTest"); // <==  is null
        }
    }

也许我使用了错误的事件?有人可以给我一个提示吗?谢谢。

【问题讨论】:

  • 这是您在 FindControl 中的 ModeChanged 事件中的拼写错误,它正在寻找 chkxboxTest...?如果那是您的代码,那可能就是问题所在。
  • @Mantorok。对不起错字。但仍然为空。
  • 好的,然后试试 Rows[0].Cells[0].FindControl.
  • 还要检查 Rows[0] 的 RowType,如果是 DataControlRowType.Header 则需要参考下一行。您的代码在上面也发生了变化,FindControl 不能直接在 DetailsView1 下工作,因为它只包含行/单元格,因此您需要深入到实际包含复选框的单元格,然后调用 FindControl。
  • @Mantorok。谢谢你的回复。第一行不是类型标题,而是 DataRow。并且在 row[0] 或 row[0].Cell[0] 上使用 FindControl 仍然为空。 :(

标签: c# asp.net ajax detailsview


【解决方案1】:

void DetailsView1_ModeChanged(object sender, EventArgs e) { if (DetailsView1.CurrentMode == DetailsViewMode.Edit) var chkbox = DetailsView1.Rows[0].FindControl("chkxboxTest"); //

加粗的文字是错字吗?

我没有太多使用DetailsView,但使usre Rows[0] 不是标题行,行下是否有任何单元格?像 GridView。

更新:我假设您想要做的就是在用户更新项目后捕获控件?将事件处理程序分配给 OnItemUpdating 并尝试以下操作:

protected void updating(object sender, DetailsViewUpdateEventArgs e)
{
   var control = DetailsView1.Rows[int.Parse(e.CommandArgument.ToString())].Cells[1].FindControl("chkboxTest");
}

【讨论】:

  • 抱歉错字,事件已更改但仍为空。
  • 嗨@Mantorok。您的更新信息很有用。它可以工作......但是当用户点击更新链接/按钮时,将触发事件 ItemUpdating。而且,很遗憾地告诉你,我喜欢在模式更改为 Edit 期间获取 clientID,以便我可以在编辑模式期间初始化 javascript。
  • 罗伯特pnl。您的 ModeChanged 是否被解雇了?如果是,那么 DetailsView1.Rows[0].Cells[1].FindControl("chkboxTest") 就足够了。
  • ModeChanged 事件被触发是。但是没有找到控制。但是你已经给了我答案:)
【解决方案2】:

好的,最好的办法是为 OnDataBound 实现一个处理程序,然后执行以下操作:

  protected void databound(object sender, EventArgs e)
  {
     if (DetailsView1.CurrentMode == DetailsViewMode.Edit)
     {
        var control = DetailsView1.Rows[0].Cells[1].FindControl("chkboxTest");
        if (control != null)
        {
           // Write some JS...
        }
     }
  }

【讨论】:

  • 嗨曼托洛克。谢谢!这将解决我的问题。在此事件期间,将找到控件。感谢您的时间和回复!
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 2010-12-09
  • 2011-07-14
  • 2012-02-20
  • 2011-11-21
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多