Controls.Add()过程中出现重复值

本文关键字:过程中 Add Controls | 更新日期: 2023-09-27 18:29:29

我使用ASP Web表单和C#。我使用UserControl,所以我在代码隐藏中以编程方式创建控件。

我有一个列表视图,当我选择一个项目时,一个函数会填充我的控件(标签和文本框),用于显示我所选项目的详细信息。我有一个读取模式(标签)和一个编辑模式(文本框)。我必须通过读取模式才能访问编辑模式。

我有两种情况:

  • 当我创建一个新项目,并从容地显示其详细信息时
  • 编辑项目时,设置新值并逐步显示其详细信息

当我使用此在UserControl中添加控件时,我看到设置了重复值。Controls.Add()。问题在第一次咨询后就消失了。

例如,如果我为文本框设置了一个值,那么它在下面的控件中是重复的。如果我为前两个文本框设置值,第一个值在第二个文本框中重复,第二个在第三个文本框中将重复。

我检查是否没有控件具有相同的id。当我使用断点并添加手表时,我可以看到我的功能很好,并且在这个过程中设置了重复的值。Controls.Add().

这是我的代码:

public class GetSetConfig : UserControl, IConfig
{
    #region Composants
    // Composants pour le mode edit
    TextBox tUrl = new TextBox();
    RegularExpressionValidator valUrl = new RegularExpressionValidator();
    TextBox tHttpResp = new TextBox();
    TextBox tCredentials = new TextBox();
    TextBox tExpectedResult = new TextBox();
    TextBox tMaxExecTime = new TextBox();
    CompareValidator valMaxExecTime = new CompareValidator();
    TextBox tMaxDelay = new TextBox();
    CompareValidator valMaxDelay = new CompareValidator();
    TextBox tTimeout = new TextBox();
    CompareValidator valTimeout = new CompareValidator();
    // Composants pour le mode read         
    Label lUrlGetter = new Label();
    Label lHttpRespGetter = new Label();
    Label lCredentialsGetter = new Label();
    Label lExpectedResultGetter = new Label();
    Label lMaxExecTimeGetter = new Label();
    Label lMaxDelayGetter = new Label();
    Label lTimeoutGetter = new Label();
    #endregion
    protected override void OnInit(EventArgs e)
    {
        #region Edit
        tUrl.ID = "tUrl";
        tHttpResp.ID = "tHttpResp";
        tCredentials.ID = "tCredentials";
        tExpectedResult.ID = "tExpectedResult";
        tMaxExecTime.ID = "tMaxExecTime";
        tMaxDelay.ID = "tMaxDelay";
        tTimeout.ID = "tTimeout";
        #endregion
        #region Validation
        //// Url
        valUrl.ID = "valUrl";
        valUrl.ControlToValidate = tUrl.ID;
        valUrl.ValidationExpression = @"((http:'/'/|https:'/'/)(www.)?(([a-zA-Z0-9-]){2,}'.){1,4}([a-zA-Z]){2,6}('/([a-zA-Z-_/.0-9#:+?%=&;,]*)?)?)";
        valUrl.ErrorMessage = "Invalid format. Url must begin with http:// or https://.";
        //// Max exec time
        valMaxExecTime.ID = "valMaxExecTime";
        valMaxExecTime.ControlToValidate = tMaxExecTime.ID;
        valMaxExecTime.Type = ValidationDataType.Integer;
        valMaxExecTime.Operator = ValidationCompareOperator.GreaterThanEqual;
        valMaxExecTime.ValueToCompare = 0.ToString();
        valMaxExecTime.ErrorMessage = "Invalid format. Please enter a number greater than or equal to 0.";
        //// Max delay
        valMaxDelay.ID = "valMaxDelay";
        valMaxDelay.ControlToValidate = tMaxDelay.ID;
        valMaxDelay.Type = ValidationDataType.Integer;
        valMaxDelay.Operator = ValidationCompareOperator.GreaterThanEqual;
        valMaxDelay.ValueToCompare = 0.ToString();
        valMaxDelay.ErrorMessage = "Invalid format. Please enter a number greater than or equal to 0.";
        //// Timeout
        valTimeout.ID = "valTimeout";
        valTimeout.ControlToValidate = tTimeout.ID;
        valTimeout.Type = ValidationDataType.Integer;
        valTimeout.Operator = ValidationCompareOperator.GreaterThanEqual;
        valTimeout.ValueToCompare = 0.ToString();
        valTimeout.ErrorMessage = "Invalid format. Please enter a number greater than or equal to 0";
        #endregion
        #region Read
        lUrlGetter.ID = "lUrlGetter";
        lHttpRespGetter.ID = "lHttpRespGetter";
        lCredentialsGetter.ID = "lCredentialsGetter";
        lExpectedResultGetter.ID = "lExpectedResultGetter";
        lMaxExecTimeGetter.ID = "lMaxExecTimeGetter";
        lMaxDelayGetter.ID = "lMaxDelayGetter";
        lTimeoutGetter.ID = "lTimeoutGetter";
        #endregion
        base.OnInit(e);
    }
    protected override void CreateChildControls()
    {
        // tester EditMode pour gerer l'affichage : getter ou setter ?
        //
        #region ce qui ne change jamais
        // Controls thate never change
        #endregion
        if (this.EditMode == true)
        {
            #region Mode edit
            // Url interrogee
            this.Controls.Add(tUrl);
            this.Controls.Add(valUrl);
            // Http response
            this.Controls.Add(tHttpResp);
            // Credentials
            this.Controls.Add(tCredentials);
            // Expected result
            this.Controls.Add(tExpectedResult);
            // Max exec time
            this.Controls.Add(tMaxExecTime);
            this.Controls.Add(valMaxExecTime);
            // Max delay
            this.Controls.Add(tMaxDelay);
            this.Controls.Add(valMaxDelay);
            // Timeout
            this.Controls.Add(tTimeout);
            this.Controls.Add(valTimeout);
            #endregion
        }
        else
        {
            #region Mode read
            // Url interrogee
            this.Controls.Add(lUrlGetter);
            // Http response
            this.Controls.Add(lHttpRespGetter);
            // Credentials
            this.Controls.Add(lCredentialsGetter);
            // Expected result
            this.Controls.Add(lExpectedResultGetter); // DUPLICATED VALUE SETS HERE !!
            // Max exec time
            this.Controls.Add(lMaxExecTimeGetter);
            // Max delay
            this.Controls.Add(lMaxDelayGetter);
            // Timeout
            this.Controls.Add(lTimeoutGetter);
            #endregion
        }
        base.CreateChildControls();
    }
    // Save new details after I edit the selected item
    public ISettings SaveSettings()
    {
        var settings = new Settings();
        settings.Url = tUrl.Text;
        settings.HttpResponse = tHttpResp.Text;
        settings.Credentials = tCredentials.Text;
        settings.ExpectedResult = tExpectedResult.Text;
        settings.MaxExecTime = tMaxExecTime.Text;
        settings.MaxDelay = tMaxDelay.Text;
        settings.Timeout = tTimeout.Text;
        return settings;
    }
    // Populate my controls with details of my selected item
    public void LoadSettings(ISettings settings)
    {
        Settings getSettings = new Settings();
        getSettings = (Settings)settings;
        lUrlGetter.Text = tUrl.Text = getSettings.Url;
        lHttpRespGetter.Text = tHttpResp.Text = getSettings.HttpResponse;
        lCredentialsGetter.Text = tCredentials.Text = getSettings.Credentials;
        lExpectedResultGetter.Text = tExpectedResult.Text = getSettings.ExpectedResult;
        lMaxExecTimeGetter.Text = tMaxExecTime.Text = getSettings.MaxExecTime;
        lMaxDelayGetter.Text = tMaxDelay.Text = getSettings.MaxDelay;
        lTimeoutGetter.Text = tTimeout.Text = getSettings.Timeout;
    }

你知道吗?我不明白问题出在哪里。这是非常奇怪的,它发生在一个简单的Controls.Add()

提前感谢:)

Controls.Add()过程中出现重复值

问题是由Viewstate引起的。我用解决它

  • 在CreateChildControls中:所有控件都添加了可见属性到false
  • 我创建了一个函数。它测试编辑模式并更改可见财产

我知道这不是一个真正的、非常好的解决方案,但它是有效的。如果有人有更好的,我会接受的!