【问题标题】:Looping throu random amount of textboxes and get values循环遍历随机数量的文本框并获取值
【发布时间】:2016-05-30 09:43:21
【问题描述】:

在经典 ASP 中,我可以在循环通过未知输入字段时执行此操作:

<input id="textbox1" type="text">
<input id="textbox2" type="text">
<input id="textbox3" type="text">
<input id="textbox4" type="text">
<input id="textbox5" type="text">   

For i = 1 To 5  

   strTextbox = request.form("textbox" & i)

   If strTextbox <> "" Then 
    // Do the magic!
   End If

Next

这样,用户可以在文本框 1、3、4 和 5 中输入值,或者可能只在 1 和 2 中输入值,我可以在 For 循环中收集输入值。

我怎么能在 C# 中做到这一点?

我不能这样做,因为我在我的 textbox.Text 中间添加了一个 i;

for (int i = 1; i < 6; i++)
{
   strTextbox = textbox[i].Text; 

   if (!string.IsNullOrEmpty(strTextbox)
   {
     // Do the magic!
   }
}

我现在有很多 if:s 检查循环内的每个文本框,但它必须是一种更简单的方法?

【问题讨论】:

    标签: c# asp.net loops for-loop


    【解决方案1】:

    您可以在文本框的NamingContainer 上使用FindControl

    如果它们位于页面顶部且未嵌套在其他控件中,例如 GridView

    for (int i = 1; i < 6; i++)
    {
       string strTextbox = "textbox" + i.ToString();
       TextBox txt = this.FindControl(strTextbox) as TextBox;
       if (txt != null && !string.IsNullOrEmpty(txt.Text))
       {
          // ... 
       }
    }
    

    但我会改用更有意义的名字。


    我只想通过 button_click 事件访问文本框 实际页面。控件位于面板内。

    然后我会使用这种 LINQ 方法:

    List<TextBox> filledArticleTBS = txtPanel.Controls.OfType<TextBox>()
        .Where(txt => txt.ID.StartsWith("textbox") && !String.IsNullOrEmpty(txt.Text)) 
        .ToList();
    

    【讨论】:

    • 也许在 if 子句中添加类似 ` && txt.Text != String.Empty` 的内容。虽然这当然可以作为 OP 的练习......
    • 好的,看起来可以。我试图实现这一点,但我无法从文本框中获取值,我猜这是因为我嵌套了母版页!..?!我正在使用 asp:textboxes 并尝试像这样使用 findcontrol: TextBox txt = this.Master.Master.FindControl(strTextbox) as TextBox; txt 在调试时显示为 null,即使它包含文本。我也试过用这个: TextBox txt = this.FindControl(strTextbox) as TextBox;最后也尝试了这个: strTextbox = "MainContent_MainContent_textbox" + i.ToString();没有运气。 :(
    • @Slint:你真的应该考虑使用更可靠的方法。为什么不为文本框提供有意义的名称并直接访问它们?您至少应该将它们放在同一个容器控件中。他们在哪里?您想从哪里访问它们?我们必须知道这一点才能提供最佳答案。在那之前你可以使用this递归FindControl,虽然我强烈反对它,因为它不仅效率低而且容易出错。如果您在不同的命名容器中有多个具有相同 ID 的控件怎么办?!
    • 整件事都是为了批量盘点。因此,用户在 som Ajax 和 jQuery 的帮助下扫描找到文章的条形码。找到文章后,它将文本框中的条形码编号替换为实际的文章编号,然后移至下一个文本框。我永远不知道要扫描什么文章或扫描多少。我有 20 个名为 ArticleNr1 到 20 的文本框,有时用户扫描 1 篇文章,有时可能是 4 或 18 篇等。今天我使用 if (!string.IsNullOrEmpty(ArticleNr1)) 来解决它,文章 2、3、4 也是如此...并循环 20 次,但感觉效率不高。
    • 我的具有这些名称的文本框仅驻留在特定页面中。
    【解决方案2】:

    我确实设法通过一些额外的行来解决这个问题。

    所以最终的代码是首先在我的顶级母版中找到 Contentplaceholder,然后在我的嵌套 Masterpage 中搜索 Contentplaceholder,最后搜索文本框。它可以工作,但是在调试时我可以看到代码还有一些其他问题,在某些情况下找不到文本框。我将回到我以前的工作代码,我直接访问所有控件,而不是使用 findcontrol。但是,如果有人感兴趣,这对我来说(几乎)有用:

    我的顶级母版页 (Site.Master)

    <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="mysite.SiteMaster" %>
    <html>
    <head>
        // MasterPage head stuff
        // ...
    </head>
    <body>
    <asp:ContentPlaceHolder ID="MainContent" runat="server">
        // My contentpages that use only the top masterpage
        // My contentpage contacts.aspx begin here, This is in a separate file called contacts.aspx. 
        // In code the contentpage is theoretically here, when the site runns it works in another way. Here things are explained; http://odetocode.com/articles/450.aspx
        <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="contacts.aspx.cs" Inherits="mysite.contacts" %>
        <asp:Content ID="contactsContent" ContentPlaceHolderID="MainContent" runat="server">
            // Here is the content of a contentpage (contacts.aspx) that use the Site.Master
        </asp:Content>
        // contentpage contacts.aspx end here
    </asp:ContentPlaceHolder>
    </body>
    </html>
    

    我的嵌套母版页 (XYZ.master)

    <%@ Master Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="XYZMasterPage.master.cs" Inherits="mysite.XYZ.XYZMasterPage" %>
    <asp:Content ID="NestedMasterPageContentPlaceHolder" ContentPlaceHolderID="MainContent" runat="server">
    Nested MasterPage stuff
    ...
    <asp:ContentPlaceHolder ID="NestedMainContent" runat="server">
        // Here is my contentpage where textbox1, 2, 3 etc. is
        // Here is the content of a contentpage (batch.aspx) that use the nested masterpage XYZMasterPage.master
        <%@ Page Title="" Language="C#" MasterPageFile="~/XYZMasterPage.master" AutoEventWireup="true" CodeBehind="batch.aspx.cs" Inherits="mysite.XYZ.batch" %>
        <asp:Content ID="batchInvContent" ContentPlaceHolderID="NestedMainContent" runat="server">
          // Here is the content of a contentpage (batch.aspx)
          <asp:Panel ID="PanelBatch" Runat="Server" >
            <asp:TextBox runat="server" ID="ArticleNr1" />
            <asp:TextBox runat="server" ID="ArticleNr2" />
            <asp:TextBox runat="server" ID="ArticleNr3" />
            <asp:TextBox runat="server" ID="ArticleNr4" />
            <asp:TextBox runat="server" ID="ArticleNr5" />  
            <asp:Button runat="server" ID="buttSubmit" OnClick="buttSubmit_Click" />    
          </asp:Panel>
        </asp:Content>      
        // contentpage batch.aspx end here
    </asp:ContentPlaceHolder>
    

    我的 batch.aspx 代码隐藏文件

    protected void buttSubmit_Click(object sender, EventArgs e)
    {
        ContentPlaceHolder parentCP = this.Master.Master.FindControl("MainContent") as ContentPlaceHolder;
        ContentPlaceHolder childCP = parentCP.FindControl("NestedMainContent") as ContentPlaceHolder;
    
        string strTextbox = string.Empty;                
    
        for (int i = 1; i < 6; i++)
        {
           strTextbox = "ArticleNr" + i.ToString();
           TextBox txt = childCP.FindControl(strTextbox) as TextBox;
           if (txt != null && !string.IsNullOrEmpty(txt.Text))
           {
              // ... 
              // Insert to db
              // ...
           }
        }
    }
    

    【讨论】:

    • 太复杂且容易出错 ;-) 如果您想从buttSubmit_Click 访问面板中的文本框,则不需要FindControl 方法,只需PanelBatch.Controls.OfType&lt;TextBox&gt;()
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2018-11-13
    • 1970-01-01
    相关资源
    最近更新 更多