动态控制代码中的C#逻辑故障
我是编程新手,所以请不要因为我的代码太脏而恨我。如果你有一些给我的建议,我很乐意得到对初学者友好的建议。我的英语很抱歉,我希望你能理解我,也许你可以自己试试我的代码,看看我的问题在起作用 我有一个带有组框的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| } 所以我现在删除一行时并没有处理行之间的空闲空间,因为我遇到了重命名无法按预期工作的问题 谢谢你的建议动态控制代码中的C#逻辑故障,c#,winforms,dynamic,controls,panel,C#,Winforms,Dynamic,Controls,Panel,我是编程新手,所以请不要因为我的代码太脏而恨我。如果你有一些给我的建议,我很乐意得到对初学者友好的建议。我的英语很抱歉,我希望你能理解我,也许你可以自己试试我的代码,看看我的问题在起作用 我有一个带有组框的Windows窗体,组框中有一个面板。直接在表单中有一个按钮,用于将带有一组控件的行添加到面板中(在我的示例中,一行有两个按钮。一个按钮现在没有意义,另一个按钮用于删除该行) 一行中的按钮应具有相同的标签(1-X) 因此,用我的2个按钮集添加一行“很好”。我的下一个计划是,当我从一行中按del
希望您能理解我的问题。在删除按钮的过程中,代码中出现了一些问题 第一个是在这个街区:
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,这也会自动改变内容,并且稍微不那么复杂
祝你好运。如果我一直删除最后一行,也多次删除,那么添加并循环此过程时,行数也会起作用。但是如果我删除了和之间的一些行并添加了一些新的行,行计数器就不再是真的了。你帮了我很多。谢谢你抽出时间。你确实给了我希望得到的帮助。给这家伙一块饼干:)