【问题标题】:How to change index When row is selected In listview在列表视图中选择行时如何更改索引
【发布时间】:2020-09-19 10:00:32
【问题描述】:

我是 Asp.net 的初学者。我有这个由 MSSQL 数据库填充的列表视图控件。现在我想在选择列表视图行时更改列表视图索引。 下面是listview的编码

<asp:ListView ID="ListViewTask" runat="server" OnSelectedIndexChanged="ListViewTask_SelectedIndexChanged" OnSelectedIndexChanging="ListViewTask_SelectedIndexChanging">
   <ItemTemplate>
      <div class="row">
         <div class="col-md-1">
            <asp:CheckBox ID="ChkTaskDone" runat="server" Checked='<%#Eval("is_task_done")%>' CommandName="Select" OnCheckedChanged="ChkTaskDone_OnCheckedChanged" AutoPostBack="True" />
         </div>
         <div class="col-md-7">
            <asp:Label ID="llbTaskId" runat="server" Text='<%#Eval("task_id")%>' Visible="false"></asp:Label>
            <asp:LinkButton ID="lnkbtnTaskName" Style="width: auto" runat="server" Text='<%#Eval("task_name")%>' CommandName="Select"></asp:LinkButton>
         </div>
         <div class="col-md-2">
            <asp:Label class="badge badge-pill badge-dark float-right" ID="llbProjectName" runat="server" Text='<%#Eval("project_name")%>'></asp:Label>
         </div>
         <div class="col-md-2">
            <asp:LinkButton Class="float-right" ID="lnkbtnDueDate" runat="server" Text='<%#Eval("due_date","{0:d MMM}")%>' align="left"></asp:LinkButton>
         </div>
      </div>
      <hr />
   </ItemTemplate>
</asp:ListView>

我可以通过简单地在 asp:Button 上添加选择命令来更改列表视图索引,但我想在行上执行它

在我查看帖子并在谷歌搜索示例时放弃了,但没有一个适合我的情况 你能帮我确定我哪里出了问题以及应该做些什么来实现目标。

非常感谢任何帮助。

谢谢

更新:

Albert D. Kallal 的回答对我很有效。这是我在 C# 语言 page_load 事件中的代码

protected void Page_Load(object sender, EventArgs e)
{
    if (Request["__EVENTTARGET"] == "RowJump")
    {

        string ix = Request["__EVENTARGUMENT"];


        ListViewItem item = ListViewTask.Items[Convert.ToInt32(ix)];
        Label getTaskId = (Label)item.FindControl("llbTaskId");

        //then use
        string TaskId = getTaskId.Text; // you get the value or the text of the Label 
        // Do something with TaskId
    }
}

在我的情况下,我检索 Row 的 selectedIndex,然后在 html 中获取 TaskId lable 的值,即“可见 = false”,然后从该任务 Id 执行一些 Sql 操作

【问题讨论】:

    标签: c# asp.net listview


    【解决方案1】:

    好的,所以如果您有一个链接按钮,甚至该行上有一个复选框,那么如上所述,我“假设”您没有问题。

    但我们希望在行上的任意位置单击以进行选择(根据该行单击执行某些操作)。

    简单的方法是在行中添加一个点击事件并使用一些 JavaScript 来完成。 (不幸的是,您没有 asp.net 行单击事件 - 您只是没有)。所以要么你点击你的复选框,要么点击链接按钮——但没有按钮就不能点击行。

    但是,标记是非常少的代码,这种方法意味着/允许您单击行上的任意位置。

    所以,在你的表格行上,你可以这样做:

    <tr ondblclick="MyRowClick('<%# Container.DisplayIndex %>')" >
    

    所以,我的列表视图中有(表格行)。 但是,我在您的列表视图中没有看到表格行? (看起来你从模板中删除了它。我建议你把它放回去) 你有一个类行的 div,但这只是一个 div?调用一些“div”不是网络领域的表格行。

    如果您通过放置您现在拥有的整个部分来包装现有标记,您可能能够使用上述点击事件

    <tr>
    
     all your stuff here
    </tr>
    

    您应该坚持使用列表视图生成的标准布局。当然,它倾向于嵌套两个表 - 你可以删除那些额外的东西。

    但是,您确实希望在标记中保留表格的概念,并且至少要定义行的概念。你两个都没有!!!

    正如您所注意到的:您有一个链接按钮,该按钮会触发,您可以获取/获取当前行。您的复选框代码也是如此。

    但是,点击行上的“任何地方”?好吧,您的布局中至少需要存在“tr”(表格行)的概念。

    您需要/想要/应该在此处定义行类型和行。

    <tr ondblclick="MyRowClick('<%# Container.DisplayIndex %>')" class="myRowHov" >
    
       <td>
            <asp:CheckBox ID="ChkTaskDone" runat="server" etc.
       </td>
    
       <td>
           <asp:Label ID="llbTaskId" runat="server" 
                 Text='<%#Eval("task_id")%>' Visible="false"></asp:Label>
       </td>
    </tr>  <--- end of table row
    

    等等。所以,是你的行,然后 所以,每一件事都应该是一个实际的“td”(表数据)。公平地说,“td”是指标准表格“单元格”。

    而且 Visible="false" 也不好。如果你需要隐藏你想要的 Style="display:none",因为使用 visible = false,控件不会呈现并发送到浏览器,因此您的代码不能再使用该列。

    无论如何,您也许可以用一个 .. your stuff 包装现有的“div”。您必须尝试一下-我不知道它是否会起作用。如果没有,那么您需要在您拥有的每一列周围添加 。

    所以,让我们假设 tr 的想法确实有效。 (所以你所拥有的变化很小)。

    现在 ondblclick() 事件是客户端(浏览器代码)。我使用了双击,因为您已经有一个复选框和一个按钮(单击会干扰您已经拥有的那些操作和控件)。我们将偶数添加到 FULL 行。我可以假设为每个带有复选框或链接按钮的事件添加一个 click() 事件。

    然后将这段代码(比如在列表视图结束选项卡之后)放入您的标记中是一件简单的事情,如下所示:

    <script>
      function MyRowClick(qID) {
    
            // passed value is row clicked on index - starts at 0
            __doPostBack('RowJump', qID);
        }
    </script>
    

    所以,我们在上面做一个帖子。真的没有什么不同,然后单击 asp.net 按钮会做什么。但是,我们在帖子中传回了一个名为 RowJump 的“名称”。你可以为它起任何名字,然后我们传递网格点击的索引(qID)>

    所以,在后面的表单代码中,我们现在回到 vb.net 或 C#。

    所以典型的加载事件代码如下所示:

    If Request("__EVENTTARGET") = "RowJump" Then
    
        Dim ix As Long = Request("__EVENTARGUMENT")
        Dim MyListViewData As ListViewDataItem = ListView1.Items(ix)
        Dim MyLable As Label = MyListViewData.FindControl("QuoteNumLabel")
        Debug.Print("Value of row QuoteNumber = " & MyLable.Text)
    
    End If
    

    我的C#还是有点弱,不过上面会变成

    {
    long ix = Request("__EVENTARGUMENT");
    ListViewDataItem MyListViewData = ListView1.Items(ix);
    Label MyLable = MyListViewData.FindControl("QuoteNumLabel");
    Debug.Print("Value of row QuoteNumber = " + MyLable.Text);
    }
    

    那么,对于整行点击?行点击没有内置的“事件”。行索引事件将触发说你的链接按钮,但是对于一般的“点击”任何地方来选择行,获取索引然后做任何事情?好吧,它要么是一个按钮,要么你使用上面提到的一点点 JavaScript。

    上面的效果很好。并且只需要添加 2-3 行 JavaScript。

    但是,我建议当您将列表视图拖放到表单上时,您可以使用向导构建网格(选择列表视图的数据源)。然后您可以删除放置在表单中的数据源(如果您使用代码构建数据表/数据集)。 然后您开始编辑和使用布局。如前所述,您至少需要代表表格的内容,然后至少需要一个“tr”。

    【讨论】:

    • 我不认为我可以将我的整个问题放在评论中,所以尽量在回答中解释我的问题
    • 我只是犯了愚蠢的错误,将“__EVENTARGUMENT”== RowJump。在 Page_load 事件条件的 IF 条件下,为什么我的代码不起作用。无论如何感谢您的帮助:)
    猜你喜欢
    • 2012-03-28
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多