Question

I have a problem with my dynamic updatepanel that I've created.

The problem is that i want to add a validator,i.e RequriedFieldValidator, to every element that i'm creating on the serverside. This above works fine. But when i'm clicking the submit button it does nothing. I can see in the htmlShellcode that a span element is there showing the error, but it has the "style="visibility=hidden".

How do i solve this issue? i'm not really sure i'm doing it right from the beginning either(very new to programming).

MARKUP:

 <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>

SERVERSIDE CODE: (Override method OnInit is the important one)

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;
    }
Was it helpful?

Solution

But when i'm clicking the submit button it does nothing.

Since I don't see a Submit button, I'm taking a guess that you mean the Add and Remove buttons. If this is the case, the problem is that all your RequiredFieldValidators have the ValidationGroup property set to QuestionGroup but this is not set in any of your buttons.

Modify the Buttons like this:

<asp:ImageButton ID="btnAdd" runat="server" ValidationGroup="QuestionGroup" ... />
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top