0

我有一些看起来像这样的表:

<table width="650" id="myTable" runat="server">
    <tbody>
        <tr>
            <td><input type="text" /></td>
            <td><input type="text" /></td>
            <td><input type="text" /></td>
            <td><input type="text" />&nbsp;</td>
        </tr>
        <tr>
            <td><input type="text" /></td>
            <td><input type="text" /></td>
            <td><input type="text" /></td>
            <td><input type="text" />&nbsp;</td>
        </tr>
        <tr>
            <td><input type="text" /></td>
            <td><input type="text" /></td>
            <td><input type="text" /></td>
            <td><input type="text" />&nbsp;</td>
        </tr>
    </tbody>
</table>

现在,我想从中提取数据并将其存储在 XML 文件中。问题是行数未知。用户可以创建 3 到 n 行之间的任意位置。为了解决这个问题,我编写了一个小循环,逐行从表中提取数据。

// Assume the relevant items are declared and assigned a proper value.

        while (i < myTable.Rows.Count)
        {
            tRow = myTable.Rows[i];

            tNameNode.InnerText = tRow.Cells[0].InnerText;
            tUnitsNode.InnerText = tRow.Cells[1].InnerText;
            tValueNode.InnerText = tRow.Cells[2].InnerText;

            tNewEntryNode.AppendChild(tNameNode);
            tNewEntryNode.AppendChild(tUnitsNode);
            tNewEntryNode.AppendChild(tValueNode);

            tIntermediateNode.AppendChild(tNewEntryNode);

            i++;
        }

现在我在运行它之后才意识到这个问题是它不会获取输入框中的内容,只是实际的输入框代码,这并不是我真正想要的。

如何获取输入框中的内容?

4

3 回答 3

0

您可以开发一些脚本来获取生成的文本框的所有文本值,方法是为它们分配相同的 ID,然后让脚本按 ID 获取值。然后将其存储到您可以在 C# 代码中访问的变量中

文本框的 HTML,包括一个隐藏的文本框,可以使用脚本填充其余文本框的值:

<input type="text" class="userTxtBox" />
<input type="hidden" Id="hiddenTxtBox" />

此时个人对 JQuery 的偏好(但我很确定您可以使用任何脚本完成类似的操作):

$('body').live('input','.userTxtBox', function () {
  $('#hiddenTxtBox').val($('.userTxtBox').val());
});

然后,在您的 C# 代码中,您可以从 hiddenTxtBox 中获取文本。

于 2013-06-20T20:21:48.297 回答
0

这是完成您正在做的事情的另一种方法的非常粗略的草图,但从长远来看可能比添加直接 html 更易于维护。看起来您要添加的行都遵循一些共同的模式,甚至代表一些共同的功能。.NET webforms 有专门为此目的而制作的东西:用户控件。制作一个用户控件,如

<% @ Control Language="C#" ClassName="InputRow" %>
<table>
  <tr>
    <td><asp:textbox ... /></td>
    <td><asp:textbox ... /></td>
    <td><asp:textbox ... /></td>
    <td><asp:textbox ... /></td>
  </tr>
</table>

在您的主页上注册它。然后,不要添加输入框,而是使用

myTable.Controls.Add(new InputRow(...

诚然,我的网络表单有点生疏,您实际上可能无法直接添加到表类的 Controls 属性中。如果失败,您始终可以将其添加到 Asp:Panel 对象的 Controls 属性中。

这将更易于维护的原因是您可以将输入框的获取逻辑封装在您的用户控件中,并在其他页面上使用它。在列表中跟踪一组这些控件将使您能够以面向对象的方式迭代所有这些控件并以结构化方式提取它们的数据。

于 2013-06-20T21:15:27.897 回答
0

我采用的解决方案如下所示:

    while (i < myTable.Rows.Count)
    {
        tRow = tblCropsAndFeed.Rows[i];

        string tInputBox0 = tRow.Cells[0].Controls[0].ClientID;
        tContent = (HtmlInputText)tRow.FindControl(tInputBox0);
        tNameNode.InnerText = tContent.Value;

        string tInputBox1 = tRow.Cells[1].Controls[0].ClientID;
        tContent = (HtmlInputText)tRow.FindControl(tInputBox1);
        tUnitsNode.InnerText = tContent.Value;

        string tInputBox2 = tRow.Cells[2].Controls[0].ClientID;
        tContent = (HtmlInputText)tRow.FindControl(tInputBox2);
        tValueNode.InnerText = tContent.Value;

        tNewEntryNode.AppendChild(tNameNode);
        tNewEntryNode.AppendChild(tUnitsNode);
        tNewEntryNode.AppendChild(tValueNode);

        tCropsAndFeedNode.AppendChild(tNewEntryNode);

        i++;
    }

我遇到的最大问题是 C# 将输入框视为 DirectControl 对象,这使得几乎不可能从中得到任何东西。添加后

runat="server"

对于输入框,一切都很好。

于 2013-06-21T18:27:45.103 回答