2

如果您需要更多背景信息,这个问题与我的最后一个问题有关。

我的问题是:是否有可能使 asp.net 表格中的单元格可点击?

或者是否至少可以在 ASP.NET 中制作一个不是 Button 或 LinkBut​​ton 的可点击 WebControl(应该可以放置在 ControlCollection 中)?如果没有,是否可以将多行信息放入按钮文本中?

我尝试将其他组件添加到按钮的 ControlCollection (我已经看到在Button的 Windows 窗体版本中工作),以查看是否可以将子组件呈现到按钮,但没有成功:

private void ModifyTableCell(TableCell cell)
{
    //Create new button
    Button btnCell = new Button();
    btnCell.Click += (sender, args) =>
    {
        //Event for the button
    };

    //Create new Label
    Label lblCell = new Label();
    lblCell.Font.Bold = true;
    lblCell.Text = "This text won't appear";

    btnCell.Controls.Add(lblCell); //Attempt to add label to Button
    cell.Controls.Add(btnCell);
}

编辑:我最终只是为整个单元格创建了一个多行的 LinkBut​​ton。

4

5 回答 5

6

onclick通过分配属性并利用该__doPostBack功能,您应该能够使几乎任何控件都可点击。

ctrl.Attributes["onclick"] = string.Format("__doPostBack('{0}', '{1}');", ctrl.ClientID, "SomeArgument");

您也可以使用该GetPostBackEventReference方法。这个选项实际上更安全,因为它会注册__doPostBack它不存在的函数:

ctrl.Attributes["onclick"] = Page.ClientScript.GetPostBackEventReference(ctrl, string.Empty);

然后,在代码隐藏中,您可以简单地覆盖该RaisePostBackEvent方法:

protected override void RaisePostBackEvent(IPostBackEventHandler source, string eventArgument)
{
    base.RaisePostBackEvent(source, eventArgument);

    if (eventArgument == "SomeArgument") //using the argument
    {
        //do whatever
    }
}
于 2012-05-08T14:12:20.990 回答
1

您可以使用字符串生成器向 asp.net 按钮添加多行,例如:

System.Text.StringBuilder buttonText = new System.Text.StringBuilder();
buttonText.AppendLine("first line");
buttonText.AppendLine("second line");
btnMultiline.Text = buttonText.ToString;
于 2012-05-08T14:13:11.300 回答
1

我不确定您如何想象这样的复合控件会被呈现。请记住,每个 ASP.NET 控件最终都会输出 HTML。You Button 基本上输出一个

<input type="button">The button text</input>

如果您想在<input>标签内放置任何其他内容,则它必须与 HTML 兼容。我不确定输入标签是否允许在其中使用其他 HTML。

另一方面,如果它是 LinkBut​​ton,则生成的 HTML 标记是一个<a href="">标记。你可以在那里放任何东西,如果你愿意的话,甚至是一张图片,它会变成可点击的。

我不确定您的完整方案是什么,但是您尝试做的事情闻起来很糟糕。我建议您使用 LinkBut​​ton 或重新考虑您的方法,只要记住 HTML 的最终输出是什么。

于 2012-05-08T14:25:29.300 回答
0

在阅读您的两个帖子时,您似乎希望能够单击单元格中的任何内容并将其回发,就好像整个单元格是一个按钮一样?

如果是这样,其中一种相当简单的方法是构建您的单元格内容,就像您不尝试回发时一样。然后添加一个样式为display:none;. 然后,您可以使用客户端脚本来捕获单元格的单击事件,并引发按钮的单击事件以导致回发。

这允许您以您喜欢的任何方式创建单元格内容,并且会自动为您生成回发代码和处理程序。

使用 JQuery,您最终会得到以下内容:

<head runat="server">
    <style>
        input.ClickableCellButton
        {
            display: none;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $("td.ClickableCell").click(function (event) { $(event.target).children("input.ClickableCellButton").click() });
        });
    </script>
    <div>
        <table>
            <tbody>
                <tr>
                    <td class="ClickableCell">
                        Cell Contents<br />
                        on multiple lines
                        <asp:Button ID="Button1" runat="server" Text="Button" CssClass="ClickableCellButton"
                            OnClick="Button1_Click" />
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    </form>
</body>
于 2012-05-08T14:41:21.050 回答
-1

如果没有,是否可以将多行信息放入按钮文本中?

对于这种特殊情况,您只能通过 CSS 完成此操作;无需扩展按钮:

<asp:button id="myMultilineButton" runat="server" style="width:60px; white-space: normal;" Text="Several lines of text" />

它将呈现为:

在此处输入图像描述

于 2012-05-08T14:33:24.137 回答