ASP.NET visible/invisible Table 中的行(C#)

ASP.NET visible/invisible Rows in Table(C#)

我有一个 System.Web.UI.WebControls.Table,有五个 ROW,五个单元有服务器控件。在我的 "Page_load" => CreateChildControls() 中只有 Row1 可见,其他行不可见。

我想在单击 btnAdd_Click 的位置逐行添加到 table,在单击 btnDell_Click 的位置删除 table 中的最后一个可见行。 .. 怎么做?

这是我在 PageLoad 中的 UI:

这是我的 UI 当点击 BtnAdd 时:

这是我的按钮代码,但不起作用:

        void btnAdd_Click(object sender, EventArgs e)
    {

        if (tRow1.Visible)
        {
            tRow2.Visible = true;
            tRow3.Visible = false;
            tRow4.Visible = false;
            tRow5.Visible = false;
        }

        if (tRow1.Visible && tRow2.Visible && !tRow3.Visible)
        {
            tRow3.Visible = true;
            tRow4.Visible = false;
            tRow5.Visible = false;
        }

    }

    void btnDell_Click(object sender, EventArgs e)
    {

    }

虽然实际上并不是在后端删除和添加(你总是有5行table)。

DataRow[] rows = new DataRow[]{tRow1, tRow2.....};//im not sure how you refferenced them;
void btnAdd_Click(object sender, EventArgs e)
{
  foreach(DataRow dr in rows)
  {
     if(!dr.Visible)
     {
        dr.Visible = true;
        return;
     }
  }
}

void btnAdd_Click(object sender, EventArgs e)
{
  foreach(DataRow dr in rows.Reverse())
  {
     if(dr.Visible)
     {
        dr.Visible = false;
        return;
     }
  }
}

类似的东西?

更好的方法是动态添加行。对于您的问题,您可以尝试使用 foreach 语句来简化 btnAdd_Click 中的 "if" 条件。 (假设您的 Table id 是 "Table1")。

        foreach (TableRow row in Table1.Rows.Cast<TableRow>().Where(row => !row.Visible))
        {
            row.Visible = true;
            return;
        }

对于您的删除,如果可行,请尝试下面的操作,下面的代码将搜索最后一个可见行并将其设置为 属性 false 以隐藏它。

        if (Table1.Rows.Cast<TableRow>().Count(row => row.Visible) > 1)
        {
            Table1.Rows.Cast<TableRow>().Last(row => row.Visible).Visible = false;
        }

对于关于如何清除文本框的下一个问题,您可以像检索每个值时访问每个单元格文本框那样做,而不是获取您只需要清除值的值。

或者简单地迭代每个单元格中的每个控件并获取每个单元格的所有文本框。一旦你掌握了你希望的控制权,你就可以做任何你想做的事。为此,您可以在每个单元格中搜索带有 typeOf(TextBox) 的控件。

首先将 table 行放入 if 条件中的一个变量中,替换代码以隐藏该行。:

var tableRow = Table1.Rows.Cast<TableRow>().Last(row => row.Visible);

然后您可以在每个单元格中执行另一个 foreach 循环以访问该单元格:

foreach (TableCell item in tableRow.Cells)
{
     foreach (Control cntrl in item.Controls.Cast<Control>().Where(cntrl => cntrl.GetType() == typeof (TextBox)))
      {
           ((TextBox) cntrl).Text = string.Empty;
      }
}
tableRow.Visible = false; //Dont forget to hide the row before you exit

如果可行,您可以尝试上面的方法。如果可行,您可以通过将 2 个 foreach 函数组合到单个 foreach 循环中来简化 foreach。这将是您的任务。了解如何使用 linq,我敢肯定您会喜欢它的:-)

void btnAdd_Click(object sender, EventArgs e)
    {

        if (tRow1.Visible && !tRow2.Visible)
        {           
            tRow2.Visible = true;
            return;
        }
        else if (tRow1.Visible && tRow2.Visible && !tRow3.Visible)
        {
            tRow3.Visible = true;
            return;
        }

        else if (tRow1.Visible && tRow2.Visible && tRow3.Visible && !tRow4.Visible)
        {
            tRow4.Visible = true;
            return;
        }

        else if (tRow1.Visible && tRow2.Visible && tRow3.Visible && tRow4.Visible && !tRow5.Visible)
        {
            tRow5.Visible = true;
            return;
        }
    }

有了这个工作 :) 如何用 btnDell 删除最后一个可见行?使用 foreach 或 ?

这个比较短,但我不知道它是否适合你。

void btnAdd_Click(object sender, EventArgs e)
{
   i=1       
        while ( i<5 )      
            {
              if (tRow[i].Visible & !tRow[i+1].Visible)        
                  {
                      tRow[i+1].Visible = true;
                      Break;
                  }
              else
                 i++;
            }
}