簡體   English   中英

如何在列表視圖中選擇行時更改索引

[英]How to change index When row is selected In listview

我是 Asp.net 的初學者。 我有這個由 MSSQL 數據庫填充的列表視圖控件。 現在我想在選擇列表視圖行時更改列表視圖索引。 下面是列表視圖的編碼

<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,然后獲取 TaskId 標簽的值,該值在 html 中為“visible = false”,然后從該任務 Id 執行一些 Sql 操作

好的,所以如果您在該行上有一個鏈接按鈕,甚至是一個復選框,那么如上所述,我“假設”您沒有問題。

但是我們希望在行上的任意位置進行簡單的單擊以進行選擇(根據該行單擊執行某些操作)。

簡單的方法是向該行添加一個單擊事件,並使用一些 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”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM