2

我创建的动态更新面板有问题。

问题是我想为我在服务器端创建的每个元素添加一个验证器,即 RequriedFieldValidator。以上工作正常。但是当我单击提交按钮时,它什么也不做。我可以在 htmlShellcode 中看到 span 元素显示错误,但它具有“style="visibility=hidden"。

我该如何解决这个问题?我也不确定我是否从一开始就做对了(对编程很陌生)。

标记:

 <asp:Panel ID="UpdatepanelWrapper" CssClass="Updatepanelwrapper" runat="server">
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:PlaceHolder runat="server" ID="WholeWrapper">

                <asp:PlaceHolder runat="server" ID="QuestionWrapper">
                    <asp:PlaceHolder runat="server" ID="LabelQuestion"><asp:PlaceHolder>
                    <asp:PlaceHolder runat="server" ID="Question"></asp:PlaceHolder>                        
                </asp:PlaceHolder>                    
                </asp:PlaceHolder>
            </asp:PlaceHolder>
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="btnAdd" EventName="Click" />
            <asp:AsyncPostBackTrigger ControlID="btnDelete" EventName="Click" />
        </Triggers>

    </asp:UpdatePanel>
<asp:Panel ID="ButtonPanel" CssClass="ButtonPanel" runat="server">
        <asp:ImageButton ID="btnDelete" runat="server" ImageUrl="~/Images/Deleteicon.png" CssClass="DeleteButton" OnClientClick="btnDelete_Click" />
        <asp:ImageButton ID="btnAdd" runat="server" ImageUrl="~/Images/Addicon.png" CssClass="AddButton" OnClientClick="btnAddQuestion_Click" />
    </asp:Panel>
</asp:Panel>

服务器代码:(重写方法 OnInit 是重要的)

public partial class _Default : Page
{
    static int CountOfQuestions = 1;

    private RequiredFieldValidator[] ArrRequiredFieldQuestion;
    private Panel[] ArrWholePanel;
    private Panel[] ArrQuestionPanel;

    private Label[] ArrQuestionLabel;
    private TextBox[] ArrQuestionBox;

    protected void Page_Load(object sender, EventArgs e)
    {

    }
    private void LoadControls()
    {
        Control myControl = GetPostBackControl(this.Page);

        if (myControl != null)
        {
            if (myControl.ID.ToString() == "btnAdd") //Ändra till btnAddQuestion om en "button" ska användas
            {
                CountOfQuestions++;
            }
            if (myControl.ID.ToString() == "btnDelete")
            {
                CountOfQuestions--;
            }

        }
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        if (!IsPostBack)
        {
            CountOfQuestions = 1;
        }
        LoadControls();

        ArrRequiredFieldQuestion = new RequiredFieldValidator[CountOfQuestions];
        ArrWholePanel = new Panel[CountOfQuestions];
        ArrQuestionPanel = new Panel[CountOfQuestions];
        ArrQuestionLabel = new Label[CountOfQuestions];
        ArrQuestionBox = new TextBox[CountOfQuestions];
        for (int i = 0; i < CountOfQuestions; i++)
        {
            RequiredFieldValidator ReqFieldQuestion = new RequiredFieldValidator();

            PlaceHolder WholeWrapper = UpdatePanel1.FindControl("WholeWrapper") as PlaceHolder;

            Panel WholePanel = new Panel();
            Panel QuestionPanel = new Panel();

            Panel CorrectAnswerPanel = new Panel();

            Label QuestionLabel = new Label();

            TextBox Question = new TextBox();



            QuestionLabel.Text = "Write your question";

            Question.TextMode = TextBoxMode.MultiLine;
            Question.Width = 550;
            Question.Height = 50;


            WholePanel.ID = "WholePanel" + i.ToString();
            QuestionPanel.ID = "QuestionPanel" + i.ToString();
            Question.ID = "tbxQuestion" + i.ToString();


            ReqFieldQuestion.ID = "Validate" + i.ToString();
            ReqFieldQuestion.ControlToValidate = "tbxQuestion" + i.ToString();
            ReqFieldQuestion.ValidationGroup = "QuestionGroup";
            ReqFieldQuestion.ErrorMessage = "Error";
            ReqFieldQuestion.Attributes.Add("runat", "server");

            QuestionPanel.CssClass = "QuestionEntry";

            QuestionPanel.Controls.Add(QuestionLabel);
            QuestionPanel.Controls.Add(Question);
            QuestionPanel.Controls.Add(ReqFieldQuestion);

            WholeWrapper.Controls.Add(WholePanel);
            WholePanel.Controls.Add(QuestionPanel);


            ArrRequiredFieldQuestion[i] = ReqFieldQuestion;

            ArrQuestionPanel[i] = QuestionPanel;

            ArrQuestionLabel[i] = QuestionLabel;
            ArrQuestionBox[i] = Question;
        }
    }

    protected void btnAddQuestion_Click(object sender, EventArgs e)
    {
        //Handeld by Pre_init and LoadControls
    }

    protected void btnDelete_Click(object sender, EventArgs e)
    {
        //Handeld by Pre_init and LoadControls
    }


    public static Control GetPostBackControl(Page thePage)
    {            
        Control postbackControlInstance = null;
        if (postbackControlInstance == null)
        {
            for (int i = 0; i < thePage.Request.Form.Count; i++)
            {
                if ((thePage.Request.Form.Keys[i].EndsWith(".x")) || (thePage.Request.Form.Keys[i].EndsWith(".y")))
                {
                    postbackControlInstance = thePage.FindControl(thePage.Request.Form.Keys[i].Substring(0, thePage.Request.Form.Keys[i].Length - 2));
                    return postbackControlInstance;
                }
            }
        }
        return postbackControlInstance;
    }
4

1 回答 1

2

但是当我单击提交按钮时,它什么也不做。

由于我没有看到提交按钮,我猜测您的意思是添加和删除按钮。如果是这种情况,问题在于您RequiredFieldValidators的所有ValidationGroup属性都设置为QuestionGroup,但您的任何按钮中都没有设置。

像这样修改按钮:

<asp:ImageButton ID="btnAdd" runat="server" ValidationGroup="QuestionGroup" ... />
于 2013-03-14T11:31:53.340 回答