Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# I';我试图在ASP.NETWebForm中对一系列控件进行分组,并使用c语言对它们进行计算#_C#_Html_Asp.net_Webforms_Visual Studio 2019 - Fatal编程技术网

C# I';我试图在ASP.NETWebForm中对一系列控件进行分组,并使用c语言对它们进行计算#

C# I';我试图在ASP.NETWebForm中对一系列控件进行分组,并使用c语言对它们进行计算#,c#,html,asp.net,webforms,visual-studio-2019,C#,Html,Asp.net,Webforms,Visual Studio 2019,这可能比我想象的要容易,但无论如何,我都被难倒了。我已经在Visual Studio 2019中创建了一个ASP.NET webform,我正在尝试找到一种方法,在表单上循环一系列控件,并对所有控件执行相同的计算 我曾尝试将控件放入一个面板中,目的是在该面板中循环,但我收到一个错误,即“foreach语句无法对'panel'类型的变量进行操作,因为'panel'不包含'GetEnumerator'的公共实例或扩展定义” 我对c#和ASP.NET以及一般编程非常陌生,因此非常感谢您的帮助。下面我已

这可能比我想象的要容易,但无论如何,我都被难倒了。我已经在Visual Studio 2019中创建了一个ASP.NET webform,我正在尝试找到一种方法,在表单上循环一系列控件,并对所有控件执行相同的计算

我曾尝试将控件放入一个面板中,目的是在该面板中循环,但我收到一个错误,即“foreach语句无法对'panel'类型的变量进行操作,因为'panel'不包含'GetEnumerator'的公共实例或扩展定义”

我对c#和ASP.NET以及一般编程非常陌生,因此非常感谢您的帮助。下面我已经将代码包含在我当前使用的.aspx文件中

<div>
        <asp:Panel ID="AgilityLabels" runat="server">
        <table class="skillTable">
            <thead>
            <tr>
                <th>Lvl</th>
                <th>Action</th>
                <th>Exp</th>
                <th>Amount</th>
            </tr>
            </thead>
            <tr>
                <td>1</td>
                <td>Gnome Stronghold</td>
                <td class="exp">86.5</td>
                <td><asp:Label ID="Label4" runat="server" Text="#ofActions"></asp:Label></td>
            </tr>
            <tr>
                <td>10</td>
                <td>Draynor Village Rooftop</td>
                <td class="exp">120</td>
                <td><asp:Label ID="Label5" runat="server" Text="#ofActions"></asp:Label></td>
            </tr>
            <tr>
                <td>20</td>
                <td>Al Kharid Rooftop</td>
                <td class="exp">180</td>
                <td><asp:Label ID="Label6" runat="server" Text="Label"></asp:Label></td>
            </tr>
            <tr>
                <td>30</td>
                <td>Varrock Rooftop</td>
                <td class="exp">238</td>
                <td><asp:Label ID="Label7" runat="server" Text="Label"></asp:Label></td>
            </tr>
            <tr>
                <td>40</td>
                <td>Canifis Rooftop</td>
                <td class="exp">240</td>
                <td><asp:Label ID="Label8" runat="server" Text="Label"></asp:Label></td>
            </tr>
            <tr>
                <td>50</td>
                <td>Falador Rooftop</td>
                <td class="exp">440</td>
                <td><asp:Label ID="Label9" runat="server" Text="Label"></asp:Label></td>
            </tr>
            <tr>
                <td>60</td>
                <td>Seer's Village Rooftop</td>
                <td class="exp">570</td>
                <td><asp:Label ID="Label10" runat="server" Text="Label"></asp:Label></td>
            </tr>
            <tr>
                <td>70</td>
                <td>Pollnivneach Rooftop</td>
                <td class="exp">890</td>
                <td><asp:Label ID="Label11" runat="server" Text="Label"></asp:Label></td>
            </tr>
            <tr>
                <td>80</td>
                <td>Rellekka Rooftop</td>
                <td class="exp">780</td>
                <td><asp:Label ID="Label12" runat="server" Text="Label"></asp:Label></td>
            </tr>
            <tr>
                <td>90</td>
                <td>Ardougne Rooftop</td>
                <td class="exp">793</td>
                <td><asp:Label ID="Label13" runat="server" Text="Label"></asp:Label></td>
            </tr>
        </table>
        </asp:Panel>
    </div>

Lvl
行动
费用
数量
1.
侏儒据点
86.5
10
德雷诺村屋顶
120
20
哈里德屋顶酒店
180
30
瓦洛克屋顶
238
40
卡尼菲斯屋顶酒店
240
50
法拉多屋顶
440
60
先见村屋顶
570
70
每个屋顶
890
80
雷勒卡屋顶
780
90
阿杜涅屋顶
793

正如您所看到的,我在一个表单元格中有一个asp:label控件,我试图对每个标签执行相同的计算,或者只是使用c#对该单元格中的数据执行计算。

好吧,在所有实际情况下,我都必须认为数据来自数据库或某个数据源。(不能真的认为页面上硬编码的值列表有那么多意义)

因此,我建议您的设计“假设”您使用的是数据表。我是说,软件领域的一张表格?这是一个数据表,因此您在设计、代码和任何软件(即使是非基于web的)的一般方法方面的任何努力都应该基于代码表的概念,然后让asp.net获取该表并显示该表。我们不再手工编写这类代码了——也许一些新接触HTML“101”的人可能会这样处理问题,但在asp.net中,一般来说,我们不必这样处理此类问题

但是,asp.net的美妙之处在于我们拥有丰富的服务器端控件和选择。如您所见,通过选择正确的asp.net控件,我们可以在加载、显示数据、甚至允许用户编辑数据、甚至一次性将更改发送回数据库方面大大节省世界贫困

因此,我建议您使用gridview,甚至listview,或者repeater(它们实际上都工作相同)

让我们来看看listview——它们对这类事情的灵活性几乎没有限制

但最重要的是什么?通过使用这些服务器端控件,您可以非常轻松地使用代码隐藏来处理、更新和编写针对重复数据的代码,例如您的问题所在

如果您不使用服务器端控件,那么您就没有很多用于代码背后的“易于”使用的控件。这个“概念”是asp.net开发周期的驱动力,一旦绘制出图表,您就会惊讶于在这里编写的代码是多么少

所以,让我们使用一个listview——如前所述,网格视图的标记可能较少——但我发现它们大致相同

因此,我们的标记可以/将如下所示:

   <asp:ListView ID="ListView1" runat="server">
        <ItemTemplate>
            <tr style="">
                <td><asp:TextBox ID="Lvl" runat="server" Text='<%# Eval("Lvl") %>' /></td>
                <td><asp:TextBox ID="Action" runat="server" Text='<%# Eval("Action") %>' /></td>
                <td><asp:TextBox ID="Exp" runat="server" Text='<%# Eval("Exp") %>' /></td>
                <td><asp:TextBox ID="Amount" runat="server" Text='<%# Eval("Amount") %>' /></td>
            </tr>
        </ItemTemplate>
        <LayoutTemplate>
            <table id="itemPlaceholderContainer" runat="server" border="0" style="">
                <tr runat="server" style="">
                    <th runat="server">lvl</th>
                    <th runat="server">Action</th>
                    <th runat="server">Exp</th>
                    <th runat="server">Amount</th>
                </tr>
                <tr id="itemPlaceholder" runat="server"></tr>
            </table>
        </LayoutTemplate>
    </asp:ListView>
public void LoadGrid()
{
    using (SqlCommand cmdSQL = new SqlCommand("SELECT ID,Lvl, Action, Exp, Amount from tblParts", new SqlConnection(My.Settings.TEST4)))
    {
        cmdSQL.Connection.Open();
        DataTable rst = new DataTable();
        rst.Load(cmdSQL.ExecuteReader);
        ListView1.DataSource = rst;
        ListView1.DataBind();
    }
}
所以,现在当我们运行这个时,我们得到:

我们可以把所有的数据放到数据库里。因此,现在我们的loadGrid将如下所示:

   <asp:ListView ID="ListView1" runat="server">
        <ItemTemplate>
            <tr style="">
                <td><asp:TextBox ID="Lvl" runat="server" Text='<%# Eval("Lvl") %>' /></td>
                <td><asp:TextBox ID="Action" runat="server" Text='<%# Eval("Action") %>' /></td>
                <td><asp:TextBox ID="Exp" runat="server" Text='<%# Eval("Exp") %>' /></td>
                <td><asp:TextBox ID="Amount" runat="server" Text='<%# Eval("Amount") %>' /></td>
            </tr>
        </ItemTemplate>
        <LayoutTemplate>
            <table id="itemPlaceholderContainer" runat="server" border="0" style="">
                <tr runat="server" style="">
                    <th runat="server">lvl</th>
                    <th runat="server">Action</th>
                    <th runat="server">Exp</th>
                    <th runat="server">Amount</th>
                </tr>
                <tr id="itemPlaceholder" runat="server"></tr>
            </table>
        </LayoutTemplate>
    </asp:ListView>
public void LoadGrid()
{
    using (SqlCommand cmdSQL = new SqlCommand("SELECT ID,Lvl, Action, Exp, Amount from tblParts", new SqlConnection(My.Settings.TEST4)))
    {
        cmdSQL.Connection.Open();
        DataTable rst = new DataTable();
        rst.Load(cmdSQL.ExecuteReader);
        ListView1.DataSource = rst;
        ListView1.DataBind();
    }
}
因此,开始考虑将数据与标记分开。因此,创建、加载一个数据表,然后将该数据表发送到显示器(listview、gridview、repeater)等

因此,请注意我们如何处理表中的数据,然后将表发送到listview

但是,我们也可以直接修改和循环列表视图。假设我们想将Exp值乘以2倍

然后我们可以使用以下代码:

protected void cmdSave_Click(object sender, EventArgs e)
{
foreach (ListViewDataItem lRow in ListView1.Items)
{
    TextBox MyAmount = lRow.FindControl("Amount");

    MyAmount.Text = MyAmount.Text * 2;
}
}
因此,您现在可以将listview(或repeater,或gridview)作为一个类似于表的结构进行循环和处理—无需使用一大堆有趣的方法来引用控件—它们是干净的、简单的,因此作为开发人员,您可以专注于编写代码—而不是如何引用网页上的控件

如果需要,请尝试使用栅格视图。我们的总加成如下:

<form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server">
        </asp:GridView>
    </div>
</form>
因此,如果不使用模板化字段,则必须使用/引用“cells”集合,而不是名称。因此,这也是为什么我经常使用listview的原因——它是一个稍微多一些的标记——但是您可以自由地为网格(列表)列插入任何有效的asp.net控件——包括复选框、图片控件——甚至自定义控件都可以反复重复

因此,Gridview当然可以少很多标记,但您倾向于放弃行的每个控件都是asp.net控件的简单性

***编辑:**************
   <asp:ListView ID="ListView1" runat="server">
        <ItemTemplate>
            <tr style="">
                <td><asp:TextBox ID="Lvl" runat="server" Text='<%# Eval("Lvl") %>' /></td>
                <td><asp:TextBox ID="Action" runat="server" Text='<%# Eval("Action") %>' /></td>
                <td><asp:TextBox ID="Exp" runat="server" Text='<%# Eval("Exp") %>' /></td>
                <td><asp:TextBox ID="Amount" runat="server" Text='<%# Eval("Amount") %>' /></td>

                <td>
                    <asp:Button ID="Button1" runat="server" Text="Update" 
                        CommandName="MyUpdate" 
                        CommandArgument = '<%# Container.DataItemIndex %>'/>
                </td>

            </tr>
        </ItemTemplate>
        <LayoutTemplate>
            <table id="itemPlaceholderContainer" runat="server" border="0" style="">
                <tr runat="server" style="">
                    <th runat="server">lvl</th>
                    <th runat="server">Action</th>
                    <th runat="server">Exp</th>
                    <th runat="server">Amount</th>
                    <th runat="server">Update</th>
                </tr>
                <tr id="itemPlaceholder" runat="server"></tr>
            </table>
        </LayoutTemplate>
    </asp:ListView>
protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e)
{

// take Exp amount, divive by 2, and put reuslt in Amount field.

int rowIX = e.CommandArgument;
ListViewDataItem lRow = ListView1.Items(rowIX);

TextBox tExp = lRow.FindControl("Exp");
TextBox tAmount = lRow.FindControl("Amount");

tAmount.Text = tExp.Text / (double)2;
}