【问题标题】:C# - Blazor @onlick how to get HTML element clicked onC# - Blazor @onlick 如何让 HTML 元素被点击
【发布时间】:2019-11-20 16:30:38
【问题描述】:

我目前正在学习 C# Blazor 框架,我面临一个问题,如何获取我点击的 HTML 元素?

我需要它来获取它在 DOM 和父 HTML 元素中的位置。

例如,使用 JQuery 的经典方式:

$('selector').click(function (event) {
    alert($(this).index());
});

http://jsfiddle.net/bCTAh/

我知道,Blazor 中有@onclick 属性,例如:

<tr @onclick="OnYes">...</tr>

@functions {
    ElementReference inputTypeFileElement;

    public async Task MainTableOnClick(MouseEventArgs e)
    {
        Console.WriteLine("clicked!");
    }
}

如何获取被点击的 TR HTML 元素的索引?

我的任务是将 Windows 窗体应用程序转换为 Web 版本。旧的 Windows 窗体有 DataGridView,每一行也有 onClick 事件和标记对象。当点击 DataGridView 的某些行时,onClick 获取该行的 Tag 对象并使用它将数据填充到表单上的另一个 DataGridView 中。所以,我需要知道,单击哪一行从某个对象(它可以是 DataTable,或者更简单地说是 Array)中获取数据。基于数组中的行索引和索引,我需要获取数据以填充网页上的另一个表。

所以,第一个表是客户(姓名、姓氏等...)。

当单击带有客户端的某些行时,我需要获取表中的行(客户端)索引。通过该索引,我将从客户端数组中获取数据。通过找到 Client 对象,我计划动态填充页面上的另一个表。

【问题讨论】:

  • XY 问题?你能解释一下为什么首先需要 html 元素吗?
  • 不是 XY 问题,我需要找到匹配元素集中第一个元素相对于其兄弟元素的位置 - api.jquery.com/index

标签: c# jquery asp.net-core .net-core blazor


【解决方案1】:

在这种情况下,您可以使用JSInterop

或者

<tr @onclick="() => TrClickedAtIndex(0)">...</tr>

@code {
    ElementReference inputTypeFileElement;

    public void TrClickedAtIndex(int index)
    {
        Console.WriteLine($"tr clicked at index {index}!");
    }
}

【讨论】:

  • 也就是说,如果没有在方法参数中传递元素索引(int),就不可能从 DOM 中获取类似 Jquery 样式的索引?
  • 我想知道为什么您实际上需要索引,也许还有其他方法可以在不访问索引的情况下实现您需要的行为。
  • 我的任务是将 Windows 窗体应用程序转换为 Web 版本。旧的 Windows 窗体有 DataGridView,每一行也有 onClick 事件和标记对象。当点击 DataGridView 的某些行时,onClick 获取该行的 Tag 对象并使用它将数据填充到表单上的另一个 DataGridView 中。所以,我需要知道,单击哪一行从某个对象(它可以是 DataTable,或者更简单地说是 Array)中获取数据。基于数组中的行索引和索引,我需要获取数据以填充网页上的另一个表。
  • 好的,我现在就做。
  • 使用@,例如:@foreach (var line in dataGridView1) { &lt;tr @onclick="() =&gt; OnYes(line)&gt; @foreach (var col in line.cols) { &lt;td @onclick="() =&gt; ColLineClicked(col, line)" &gt; @col ...
【解决方案2】:

如果您想获取元素,可以使用 @ref 返回元素,但通常在 Blazor 中,您对元素不感兴趣(就像在 JQuery 中一样),而是它们与什么相关。

我创建了这个简单的 BlazorFiddle,它在一个表中列出了三个字符串。它与另一个答案相似,但它表现出一点皱纹 - 从循环或枚举传递值时,您需要分配它。

https://blazorfiddle.com/s/br8lwsl2

这显示了一个包含三个字符串的表格。当您单击一行时,它会从单击的行传递数据项 - 而不仅仅是索引。

    int index = i;
    <tr @onclick="()=> ClickedRow(list[index])" ><td>

希望对你有帮助

【讨论】:

  • 在这种情况下使用快速分配非常有用的提示,有用的小提琴!
  • 我发现这个解决方案比使用 JSInterop 更好。 Blazor 的全部意义在于不必求助于 JS 来解决这些简单的问题。这应该是公认的答案
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多