2017-06-12 52 views
0

我对编程非常新颖,所以请不要讨厌我的脏代码。如果你有一些适合我的话,我很乐意为你提供初学者友好的提示。抱歉我的英语,我希望你能理解我,也许你自己尝试我的代码,看看我的问题在行动。动态控制中的C#逻辑故障代码

我有一个Windows窗体与一个组框,在组框中是一个面板。直接在窗体中有一个按钮,用一组控件添加一行(在我的情况下,1行有2个按钮,一个没有感觉,一个可以删除行)放到面板中。

在一排按钮应具有相同的标签(1-X)

因此增加一排我的2个按钮的集作品“精”。我的下一个计划是当我按下一行中的删除按钮时删除该行。

删除了一个我认同控制标签的行后,我想减少名称的数值(如果我删除第1行的功能2到功能1),每个按钮的标签和文本有一个标记值高于删除的行号。所以我认为这是失败的地方。

它的工作正常,添加和删除。但不是,如果我想再次添加一行。我必须多次点击才能添加新行。

为了解释什么,我想做的事:

 
|ADD ROW BUTTON| //Clicked 4 Times already 

PANEL 
{ 
|Function 1| --- |Delete 1| 
|Function 2| --- |Delete 2| 
|Function 3| --- |Delete 3| 
|Function 4| --- |Delete 4| 
} 



// Clicking |Delte 2| 
// Removed Row 2 and rename those which have bigger Row number as the deleted row with decreased value for the Text, Tag & Name 
// So row 2 gets removed, Function 3 becomes Function 2 and Function 4 becomes Function 3 

PANEL 
{ 
|Function 1| --- |Delete 1| 
|Function 2| --- |Delete 2| 
|Function 3| --- |Delete 3| 
} 

但他们大多是“从不”重命名就像我在我的代码/心中已经计划。只有有时,当“玩”它会重命名按钮

我的代码看起来是这样的(开始与面板PNL命名和行Add按钮一个WinForm):

public partial class Form1 : Form 
{ 
    int rowCount = 0; 
    int lastY; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void btnAdd_Click(object sender, EventArgs e) 
    { 
     AddRow(); 
    } 

    public void AddRow() 
    { 
     rowCount++; 
     label1.Text = rowCount.ToString(); 
     #region Create the Function Button in a row 
     Button btnFunction = new Button(); 
     if (rowCount == 1) 
     { 
      btnFunction.Location = new Point(10, 5); 
     } 
     else if (rowCount > 1) 
     { 
      Control[] letztesY = pnl.Controls.Find($"btnFunction{rowCount - 1}", true); 

      foreach (var button in letztesY) 
      { 
       lastY = button.Location.Y; 

      } 
      btnFunction.Location = new Point(10, lastY + 25); 
     } 
     else 
     { 
      MessageBox.Show("Unerwarteter Fehler"); 
     } 

     btnFunction.Name = "btnFunction" + rowCount; 
     btnFunction.Tag = rowCount; 
     btnFunction.Text = "Function " + rowCount.ToString(); 
     pnl.Controls.Add(btnFunction); 
     #endregion 

     #region Create the Delete Row Button in a row 
     Button btnDelete = new Button(); 
     if (rowCount == 1) 
     { 
      btnDelete.Location = new Point(85, 5); 
     } 
     else if (rowCount > 1) 
     { 
      Control[] letztesY = pnl.Controls.Find($"btnDelete{rowCount - 1}", true); 

      foreach (var button in letztesY) 
      { 
       lastY = button.Location.Y; 

      } 
      btnDelete.Location = new Point(85, lastY + 25); 
     } 
     else 
     { 
      MessageBox.Show("Fail"); 
     } 

     btnDelete.Name = "btnDelete" + rowCount; 
     btnDelete.Tag = rowCount; 
     btnDelete.Text = "Delete " + rowCount.ToString(); 
     btnDelete.Click += new EventHandler(deleteCallerRow); 
     pnl.Controls.Add(btnDelete); 
     #endregion 

    } 

    private void deleteCallerRow(object sender, EventArgs e) 
    { 
     rowCount--; 
     label1.Text = rowCount.ToString(); 

     Button delCaller = sender as Button; 

     #region DeltePressedRowDelButton 
     Control[] toBeRemovedDelButtons = pnl.Controls.Find($"btnDelete{delCaller.Tag}", true);     
     foreach (var delBtn in toBeRemovedDelButtons) 
     { 
      pnl.Controls.Remove(delBtn); 
      delBtn.Dispose(); 

     } 

     Control[] toBeRemovedFunctionButtons = pnl.Controls.Find($"btnFunction{delCaller.Tag}", true); 
     foreach (var funcBtn in toBeRemovedFunctionButtons) 
     { 
      pnl.Controls.Remove(funcBtn); 
      funcBtn.Dispose(); 

     } 
     #endregion 

     #region Decrease Numbers in Buttons Texts, Tags and Names 
     Control[] toBeRenamedDeleteButtons = pnl.Controls.Find($"btnDelete", true); 
     foreach (var db in toBeRenamedDeleteButtons) 
     { 
      if (Convert.ToInt32(db.Tag) > Convert.ToInt32(delCaller.Tag)) 
      { 
       db.Name = "btnDelete" + Convert.ToString(Convert.ToInt32(db.Tag) - 1); 
       db.Tag = Convert.ToInt32(db.Tag) - 1; 
       db.Text = "Delete " + Convert.ToString(Convert.ToInt32(db.Tag) - 1); 
      } 
     } 

     Control[] toBeRenamedFunctionButtons = pnl.Controls.Find($"btnFunction", true); 
     foreach (var fb in toBeRenamedFunctionButtons) 
     { 
      if (Convert.ToInt32(fb.Tag) > Convert.ToInt32(delCaller.Tag)) 
      { 
       fb.Name = "btnFunction" + Convert.ToString(Convert.ToInt32(fb.Tag) - 1); 
       fb.Tag = Convert.ToInt32(fb.Tag) - 1; 
       fb.Text = "Function " + Convert.ToString(Convert.ToInt32(fb.Tag) - 1); 
      } 

     } 
     #endregion 


    } 
} 

,所以我没有处理行之间的空闲空间时,现在删除一个,因为我在重命名问题与问题的预期不起作用。

感谢您的任何建议帮助。

希望你能理解我的问题。

+0

那么,如果我alwas删除最后一行,也是多次,rowCount也适用于添加和循环此过程。但是,如果我删除一些行之间并添加一些新的行,rowCounter不再是真实的。 –

回答

0

在您的代码中有几件事情在删除按钮期间造成问题。

首先是在此块:

Button delCaller = sender as Button; 

    #region DeltePressedRowDelButton 
    Control[] toBeRemovedDelButtons = pnl.Controls.Find($"btnDelete{delCaller.Tag}", true);     
    foreach (var delBtn in toBeRemovedDelButtons) 
    { 
     pnl.Controls.Remove(delBtn); 
     delBtn.Dispose(); 

    } 

    Control[] toBeRemovedFunctionButtons = pnl.Controls.Find($"btnFunction{delCaller.Tag}", true); 
    foreach (var funcBtn in toBeRemovedFunctionButtons) 
    { 
     pnl.Controls.Remove(funcBtn); 
     funcBtn.Dispose(); 

    } 

您存储发件人(按钮)在delCaller但随后处置它,当你在面板中找到它。即使您已经处理了它,您仍可继续使用存储的按钮。在处理它之前,您需要将标记存储在另一个变量中。

二是在此块:

db.Name = "btnDelete" + Convert.ToString(Convert.ToInt32(db.Tag) - 1); 
db.Tag = Convert.ToInt32(db.Tag) - 1; 
db.Text = "Delete " + Convert.ToString(Convert.ToInt32(db.Tag) - 1); 

您设置文本的前更改db.Tag,所以文本将显示出比你正在寻找一个较低的值。

测试修改删除功能:

private void deleteCallerRow(object sender, EventArgs e) 
    { 
     rowCount--; 
     label1.Text = rowCount.ToString(); 

     Button delCaller = sender as Button; 
     int callerTagNo = (int)delCaller.Tag; 

     #region DeltePressedRowDelButton 
     Control[] toBeRemovedDelButtons = pnl.Controls.Find("btnDelete" + callerTagNo, true); 
     foreach (var delBtn in toBeRemovedDelButtons) 
     { 
      pnl.Controls.Remove(delBtn); 
      delBtn.Dispose(); 

     } 

     Control[] toBeRemovedFunctionButtons = pnl.Controls.Find("btnFunction" + callerTagNo, true); 
     foreach (var funcBtn in toBeRemovedFunctionButtons) 
     { 
      pnl.Controls.Remove(funcBtn); 
      funcBtn.Dispose(); 

     } 
     #endregion 

     #region Decrease Numbers in Buttons Texts, Tags and Names 
     foreach (Control b in pnl.Controls) 
     { 
      if(b.Name.Contains("btnDelete")) 
      { 
       if(callerTagNo < (int)b.Tag) 
       { 
        //Rename 
        int newTag = (int)b.Tag - 1; 
        b.Name = "btnDelete" + newTag; 
        b.Tag = newTag; 
        b.Text = "Delete " + newTag; 
       } 
      } 
      else if(b.Name.Contains("btnFunction")) 
      { 
       if(callerTagNo < (int)b.Tag) 
       { 
        //Rename 
        int newTag = (int)b.Tag - 1; 
        b.Name = "btnFunction" + newTag; 
        b.Tag = newTag; 
        b.Text = "Function " + newTag; 
       } 
      } 
     } 
     #endregion 
    } 

注意: 我会建议使用控件的Dock属性为您放置按钮。这将大大简化您的添加/删除它们。我将执行以下任一操作:

1)添加一对按钮时,不是将它们添加到主面板(pnl),而是将它们添加到新面板,然后将该面板添加到主面板中Dock属性设置为顶部。这将允许他们在添加或移除时自动移位。在对接和WinForms上有很多资源可以帮助您开始使用,例如here

2)使用带有2列的TableLayoutPanel和Dock设置为Fill,它会自动移动,并且稍微不复杂。

祝你好运。

+0

你帮了我很多。感谢您抽出宝贵的时间。你确实给了我希望的帮助。给这个人一个饼干:) –