【问题标题】:Can I add buttons in ASP table column and get in which row button was clicked?我可以在 ASP 表格列中添加按钮并获取单击了哪一行按钮吗?
【发布时间】:2010-11-01 21:36:14
【问题描述】:

我有 20 到 30 行和 3 列的表格。我想在单元格中添加带有按钮或其他内容的第四列,我可以单击它。并且 onClick 事件我需要获取这次点击发生在哪一行的信息。

表格是以编程方式即时生成的。

这可以做到吗,我请求一些例子。

编辑 2:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace HelpdeskOsControl
{
    public partial class Test : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //GenerateTable(getTestData());
        }

        private List<string> getTestData()
        {
            List<string> tData = new List<string>(); 
            for (int i = 0; i < 10; i++)
            {
                tData.Add("proc" + i + "_" + new Random().Next(100) + "_" + new Random().Next(100));
            }

            return tData;
        }

        protected void btnClear_Click(object sender, EventArgs e)
        {
            for (int i = Processes.Rows.Count; i > 1; i--)
            {
                Processes.Rows.RemoveAt(i - 1);
            }
        }

        protected void btnLoad_Click(object sender, EventArgs e)
        {
            GenerateTable(getTestData());
        }

        protected void btnKill_Click(object sender, EventArgs e)
        {
            lblView.Text = ((Button)sender).ID;
        }

        private void GenerateTable(List<string> list)
        {
            int st = 0;
            foreach (string line in list)
            {
                TableRow tr = new TableRow();
                Processes.Controls.Add(tr);

                foreach(String str in line.Split('_'))
                {
                    int index = tr.Cells.Add(new TableCell());
                    tr.Cells[index].Text = str;
                }

                Button b = new Button();
                b.Text = "Kill " + st;
                b.ID = "btnKill_" + st;
                b.Click += new EventHandler(btnKill_Click);
                TableCell tc = new TableCell();
                tc.Controls.Add(b);
                tr.Cells.Add(tc);

                tr.TableSection = TableRowSection.TableBody;
                Processes.Rows.Add(tr);
                st++;
            }
            Processes.BorderStyle = BorderStyle.Solid;
            Processes.GridLines = GridLines.Both;
            Processes.BorderWidth = 2;
        }

    }
}




<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Test.ascx.cs" Inherits="HelpdeskOsControl.Test" %>
<asp:Panel ID="Panel1" runat="server" Height="465px" Width="417px">
    <asp:Table ID="Processes" runat="server" Height="20px" Width="400px" CssClass="tablesorter">
        <asp:TableHeaderRow ID="ProcessesHeader" runat="server" 
        TableSection="TableHeader">
            <asp:TableHeaderCell ID="TableHeaderCell1" runat="server">Name</asp:TableHeaderCell>
            <asp:TableHeaderCell ID="TableHeaderCell2" runat="server">CPU</asp:TableHeaderCell>
            <asp:TableHeaderCell ID="TableHeaderCell3" runat="server">Memory</asp:TableHeaderCell>
            <asp:TableHeaderCell ID="TableHeaderCell4" runat="server"></asp:TableHeaderCell>
        </asp:TableHeaderRow>
    </asp:Table>
    <asp:Panel ID="Panel2" runat="server">
        <asp:Button ID="btnLoad" runat="server" onclick="btnLoad_Click" Text="Load" />
        <asp:Button ID="btnClear" runat="server" onclick="btnClear_Click" 
            Text="Clear" />
        <asp:Label ID="lblView" runat="server" Text="Label"></asp:Label>
    </asp:Panel>
</asp:Panel>



<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="HelpdeskOsControl._Default" %>

<%@ Register src="Test.ascx" tagname="WebUserControl" tagprefix="Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <p>Test Control</p>
         <Test:WebUserControl ID="Test" runat="server" />
    </div>
    </form>
</body>
</html>

当我在 Page_Load 过程中注释掉 GenerateTable(getTestData()); 时,请有人检查为什么这段代码不起作用。

【问题讨论】:

  • 你是如何生成这个表的?如果您使用的是 GridView,则可以添加 CommandField...msdn.microsoft.com/en-us/library/…
  • 最好展示您如何创建此表。该按钮将成为第 4 列的一部分。
  • 我添加了演示代码,有一些问题。

标签: c# asp.net events onclick


【解决方案1】:

如果是后面代码生成的HTMLtable,

假设你的代码是这样的,

HtmlButton b = new HtmlButton();
b.ClientID = "Button_" + i;
b.Attributes.Add("onClick", "your function(this)");

使用方法中参数的后缀部分来检查哪个按钮被点击了。 希望这可以帮助!! 编辑: 您可能仍然遵循上述逻辑。在按钮的点击事件中(这似乎对所有按钮都是通用的),您可以使用 sender 对象并获取 ID 并知道哪个按钮已被点击,如下所示:

protected void KillButton_Click(object sender, EventArgs e) 
{ 
    string ID = ((Button)sender).ID;
} 

您可以通过这种方式附加事件处理程序:

b.Click += new EventHandler(KillButton_Click);

【讨论】:

  • 我希望当我点击按钮时,我会在代码隐藏中得到这个事件。我正在使用 Asp 表格和按钮。
  • 为什么要评论GenerateTable(getTestData());从page_load事件来看,是不是因为点击load时表格会被加载两次??您可以添加 if(!IsPostBack) GenerateTable(getTestData());到页面加载。该方法只会在第一次被调用。我不确定你是否想要那个。请澄清您想要什么以及您面临的问题是什么
  • 我希望仅在单击“加载”按钮时生成该表。当我单击 Kill 按钮时,我会返回没有单击 Kill 按钮的行的表。感谢您的帮助。
  • 我会接受这个答案,因为它回答了我最初的问题。感谢您的帮助。
【解决方案2】:

ClientID 是只读的...因此您不能有尝试设置 clientID 的行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多