动态控制代码中的C#逻辑故障

动态控制代码中的C#逻辑故障,c#,winforms,dynamic,controls,panel,C#,Winforms,Dynamic,Controls,Panel,我是编程新手,所以请不要因为我的代码太脏而恨我。如果你有一些给我的建议,我很乐意得到对初学者友好的建议。我的英语很抱歉,我希望你能理解我,也许你可以自己试试我的代码,看看我的问题在起作用 我有一个带有组框的Windows窗体,组框中有一个面板。直接在表单中有一个按钮,用于将带有一组控件的行添加到面板中(在我的示例中,一行有两个按钮。一个按钮现在没有意义,另一个按钮用于删除该行) 一行中的按钮应具有相同的标签(1-X) 因此,用我的2个按钮集添加一行“很好”。我的下一个计划是,当我从一行中按del

我是编程新手,所以请不要因为我的代码太脏而恨我。如果你有一些给我的建议,我很乐意得到对初学者友好的建议。我的英语很抱歉,我希望你能理解我,也许你可以自己试试我的代码,看看我的问题在起作用

我有一个带有组框的Windows窗体,组框中有一个面板。直接在表单中有一个按钮,用于将带有一组控件的行添加到面板中(在我的示例中,一行有两个按钮。一个按钮现在没有意义,另一个按钮用于删除该行)

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

因此,用我的2个按钮集添加一行“很好”。我的下一个计划是,当我从一行中按delete按钮时,删除该行

删除我用控制标记标识的行后,我想减少每个按钮的名称(例如,如果我删除行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| } 所以我现在删除一行时并没有处理行之间的空闲空间,因为我遇到了重命名无法按预期工作的问题

谢谢你的建议


希望您能理解我的问题。

在删除按钮的过程中,代码中出现了一些问题

第一个是在这个街区:

    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();

    }
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);
您将发送者(按钮)存储在delCaller中,但在面板中找到它后,将其丢弃。然后继续使用存储的按钮,即使您已经处理了它。在处理标记之前,需要将其存储在另一个变量中

第二个是在这个街区:

    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();

    }
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
    }
private void deleteCallerRow(对象发送方,事件参数e)
{
行数--;
label1.Text=rowCount.ToString();
按钮delCaller=发送方为按钮;
int callerTagNo=(int)delCaller.Tag;
#区域DeltePressedRowDelButton
Control[]toBeRemovedDelButtons=pnl.Controls.Find(“btnDelete”+callerTagNo,true);
foreach(待删除按钮中的var delBtn)
{
pnl.控件。移除(delBtn);
delBtn.Dispose();
}
Control[]toBeRemovedFunctionButtons=pnl.Controls.Find(“btnFunction”+callerTagNo,true);
foreach(待删除功能按钮中的var funcBtn)
{
pnl.Controls.Remove(funcBtn);
functbtn.Dispose();
}
#端区
#区域减少按钮文本、标签和名称中的数字
foreach(pnl.控件中的控件b)
{
如果(b.Name.Contains(“btnDelete”))
{
if(callerTagNo<(int)b.Tag)
{
//改名
int newTag=(int)b.Tag-1;
b、 Name=“btnDelete”+newTag;
b、 标签=新标签;
b、 Text=“删除”+newTag;
}
}
else if(b.Name.Contains(“btnFunction”))
{
if(callerTagNo<(int)b.Tag)
{
//改名
int newTag=(int)b.Tag-1;
b、 Name=“btnFunction”+newTag;
b、 标签=新标签;
b、 Text=“Function”+newTag;
}
}
}
#端区
}
注意: 我建议使用控件的Dock属性来放置按钮。这将大大简化添加/删除它们的过程。我将执行以下操作之一:

1) 添加一对按钮时,不要将其添加到主面板(pnl),而是将其添加到新面板,然后将该面板添加到主面板,并将Dock属性设置为top。这将允许它们在添加或删除时自动移动。例如,在docking和WinForms上有许多资源可以帮助您开始这方面的工作

2) 使用带有2列的TableLayoutPanel,并将Dock设置为Fill,这也会自动改变内容,并且稍微不那么复杂


祝你好运。

如果我一直删除最后一行,也多次删除,那么添加并循环此过程时,行数也会起作用。但是如果我删除了和之间的一些行并添加了一些新的行,行计数器就不再是真的了。你帮了我很多。谢谢你抽出时间。你确实给了我希望得到的帮助。给这家伙一块饼干:)