【问题标题】:Way to format Form with dynamic text fields c#使用动态文本字段格式化表单的方法c#
【发布时间】:2015-03-26 22:19:13
【问题描述】:

是的,所以我有 13 个带有相应标签的文本框,这些文本框是在用户从不同的表单中决定名称后分配的(由“添加字段...”按钮实例化)。当用户希望删除包含先前输入的数据的文本框时会出现此问题,因为这会导致文本框和标签最初显示为如下图所示的空白区域:

我的问题是:我如何做到这一点,以便当用户选择删除文本框时,其后的文本框标签对替换已删除的文本框并相应地移动剩余的文本框。

设计器中的文本框标签对:

在过去的几天里,我已经深入思考了这个问题,并得出结论,以我目前对 C# 的了解,我只能用大量繁琐的 if 语句来解决这个问题(这里说成百上千) .任何和所有的帮助将不胜感激!

第一个文本框标签对的 X 按钮上的当前代码:

private void xButton1_Click(object sender, EventArgs e)
    {
        label14.Text = "";
        textBox1.Text = "";
        if (label14.Text.Equals(""))
        {
            label14.Visible = false;
            textBox1.Visible = false;
            xButton.Visible = false;
            label14.Text = "";
            textBox1.Text = "";
        }
        if (!textBox2.Text.Equals(""))
        {
            label14.Text = label15.Text;
            textBox1.Text = textBox2.Text;
        }
        if (!textBox2.Text.Equals("") && (textBox3.Text.Equals("")))
        {
            label15.Visible = false;
            textBox2.Text = "";
            textBox2.Visible = false;
            xButton2.Visible = false;
        }
    }

【问题讨论】:

  • 发布您的代码,for ex,用于 3 个标签/文本框以及您将如何做,以便我们改进它。在这种形式中,您只希望我们为您编写。
  • 我不是要求它被写出来,我是在问我如何在概念上做到这一点。虽然我会根据要求发布我当前的无效代码。
  • 这听起来像是用户控件的一个很好的用例(名称会根据您使用的 UI 框架而有所不同)。将标签和编辑合并到一个控件中,根据需要创建和删除该单个控件。
  • 您实现这些附加字段的方式似乎是静态的(硬编码)。如果确实如此,那将带来很多挑战,包括您提到的那些。使用动态方法来动态创建这些控件(或优化自定义控件)并允许它们被删除怎么样?如果您选择了正确的周围容器,该位置将自动解析。
  • @QualityCatalyst,可以很好地创建新标签和文本框,但是如何使用 x 按钮删除新创建的对?并且以下对在删除时会自动向上移动吗?谢谢你的建议

标签: c# textbox tags format field


【解决方案1】:

您可以做的一件简单的事情是在它们的Tag 属性中为所有“动态”控件(标签、文本框、按钮)赋予一个相似的值(在我的示例中,我使用字符串"dynamic" 作为所有控件@ 987654323@,方便查询。

接下来,您可以遵循这样的逻辑,即每当您删除某些控件时,您将删除的控件下方的所有控件向上移动一个距离,该距离等于被删除控件的高度加上控件之间的任何填充。

例如,当用户单击 X 按钮时,由于您知道要删除的控件底部的值,因此您可以找到所有具有匹配的 Tag 属性的控件,其顶部大于x按钮底部,可以向上移动。

这是一个示例(假设您的所有 X 按钮都映射到同一个点击事件):

private void buttonX_Click(object sender, EventArgs e)
{
    // This is represents the distance between the bottom 
    // of one control to the top of the next control
    // Normally it would be defined globally, and used when you
    // lay out your controls.
    const int controlPadding = 6;

    var xButton = sender as Button;
    if (xButton == null) return;

    var minTopValue = xButton.Bottom;
    var distanceToMoveUp = xButton.Height + controlPadding;

    // Find all controls that have the Tag and are at the same height as the button
    var controlsToDelete = Controls.Cast<Control>().Where(control =>
        control.Tag != null &&
        control.Tag.ToString() == "dynamic" &&
        control.Top == xButton.Top)
        .ToList();

    // Delete the controls
    controlsToDelete.ForEach(Controls.Remove);

    // Get all controls with the same tag that are below the deleted controls
    var controlsToMove = Controls.Cast<Control>().Where(control =>
        control.Tag != null &&
        control.Tag.ToString() == "dynamic" &&
        control.Top > minTopValue);

    // Move each control up the specified amount
    foreach (var controlToMove in controlsToMove)
    {
        controlToMove.Top -= distanceToMoveUp;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多