【问题标题】:Is there an equivalent to the Javascript function .closest() in .net?.net 中是否有与 Javascript 函数 .closest() 等效的函数?
【发布时间】:2015-12-26 23:33:36
【问题描述】:

我正在使用的网站上的表格是由转发器创建的,因此我不知道在生成页面后如何识别它们。我需要能够根据从该行中的单元格单击按钮来选择一行。

有一个 Javascript 函数可以执行此操作,但我想在 .net (C#) 中复制;

currentRow = $(evt).closest("tr");

表格是这样生成的; (包含“隐藏”按钮的最后一列)

<asp:Repeater ID="StoredProcedureRepeater" runat="server">

                    <ItemTemplate>

                        <tr ID="HideMe" class="NotHidden" runat="Server">
                            <td style="width: 300px" runat="server">
                                <asp:HyperLink runat="server" Text='<%# StoredProcedure.Caption %>' NavigateUrl='<%# Url.StoredProcedure(StoredProcedure) %>' />
                            </td>
                            <td runat="server">
                                <%# StoredProcedure.Description %>
                            </td>
                            <td runat="server">
                                <asp:HyperLink ID="EditProcedure" runat="server" Text='edit' NavigateUrl='<%# Url.EditProcedure(StoredProcedure) %>' />
                            </td>
                            <td id="HideBtn">
                                <asp:button ID="HideUnhide" runat="server" image="../images/collapse.png"  onclick="Hide_Unhide"/>
                            </td>
                        </tr>

                    </ItemTemplate>

                </asp:Repeater>

中继器的后面代码; (所以为了清楚起见,这个中继器是在另一个中继器中创建的。)

private void SchemaRepeater_ItemCreated(object sender, RepeaterItemEventArgs e)
    {
        Schema = (Schema)e.Item.DataItem;

        var storedProcedureRepeater = (Repeater)e.Item.FindControl("StoredProcedureRepeater");

        storedProcedureRepeater.ItemCreated += StoredProcedureRepeater_ItemCreated;
        storedProcedureRepeater.DataSource = _schemaStoredProcedures[Schema];
        storedProcedureRepeater.DataBind();
    } 
 private void PriorityProcedureRepeater_ItemCreated(object sender, RepeaterItemEventArgs e)
    {
        StoredProcedure = (StoredProcedure)e.Item.DataItem;
    }

【问题讨论】:

  • 我打赌你使用 Webforms,展示你的代码来呈现表格

标签: c# asp.net .net html-table repeater


【解决方案1】:

既然你说你想在 C# 中复制这个,我假设你的意思是你想在服务器端做这个。

首先,您需要在标记中为 RepeaterItemCommand 指定一个事件处理程序。

<asp:Repeater runat="server" OnItemCommand="MyRepeater_ItemCommand" ... />

然后在您的代码隐藏中,定义事件处理程序。

protected void MyRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{
}

RepeaterCommandEventArgs 包含有关导致事件的行的信息,包括用于构建该行的数据项。如果您使用 List 构建转发器,那么您的事件处理程序将如下所示:

protected void MyRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{
    var dataItem = (Widget)e.Item.DataItem; // <-- this is the dataitem for the row
    int dateItemID = dataItem.ID; // You can access the properties on your data item to "do stuff"
}

【讨论】:

  • 这似乎可能会有所帮助。虽然我只能看到中继器本身的 ID,但我看不到单击按钮的行(正在使用快速手表)。 DataItem 实际上是 null。
  • 你是如何绑定中继器的?
  • 有点做作。我自己没有写原件(典型)。我将添加到主要问题...
  • 您需要为 StoredProcedureRepeater.ItemCommand 事件添加另一个事件处理程序:storedProcedureRepeater.ItemCommand += StoredProcedureRepeater_ItemCommand;当您单击子中继器中的按钮时,您的事件处理程序应该触发。这就是您要尝试访问 DataItem 的地方。如果子中继器的事件没有触发,或者 DataItem 为空,那么您需要在不同的事件中设置一些断点以查看它们触发的顺序,因为处理程序可能以错误的顺序触发。
  • 看来问题的根源在于 DataItem 在回发期间将为空。所以数据需要重新检索。这会导致与此问题无关的问题,因此将在其他地方寻找该解决方案。
猜你喜欢
  • 2017-09-11
  • 2010-11-09
  • 2017-02-14
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多