0

リストビューとこのリストビューの外にボタンがあり、ボタンをクリックすると、InsertItemTemplate で定義された「挿入」行を追加したいと考えています。問題は、ボタンをクリックすると、この行が追加されることです(ポストバックを実行すると、この行が実際に表示されるため、これを知っています)が、表示/レンダリングされません。問題は、この変更が最初のポストバック (ボタンのクリック) に適用されないのはなぜですか? ここに私のコードがあります:

編集:
コードビハインド全体:

protected void Page_Load(object sender, EventArgs e)
    {                        
        if (!IsPostBack)
        {


            ListItem ByName = new ListItem("By name", "Name");
            ListItem ByPhone = new ListItem("By phone", "Phone");
            ListItem ByEmail = new ListItem("By email", "Email");

            FilterTypeDDL.Items.Add(ByName);
            FilterTypeDDL.Items.Add(ByPhone);
            FilterTypeDDL.Items.Add(ByEmail);
            FilterTypeDDL.DataBind();
        }
    }

    //protected void ListView_ItemCommand(object sender, ListViewCommandEventArgs e)
    //{            
        //switch (e.CommandName)
        //{
            //case "EditItem":                    
            //    break;

            //case "InsertItem":
            //    if (Page.IsValid)
            //    {
            //        string NameTxt = ((TextBox)(ListView.InsertItem.FindControl("NameTextBox"))).Text.Trim();
            //        string PhoneTxt = ((TextBox)(ListView.InsertItem.FindControl("PhoneTextBox"))).Text.Trim();
            //        string EmailTxt = ((TextBox)(ListView.InsertItem.FindControl("EmailTextBox"))).Text.Trim();
            //        DAORestaurant.InsertRestaurant(NameTxt, PhoneTxt, EmailTxt);


            //        ListView.InsertItemPosition = InsertItemPosition.None;
            //        ListView.DataSource = DAORestaurant.GetRestaurants();
            //        ListView.DataBind();
            //        break;
            //    }
            //    break;

            //case "CancelCreation":
            //    ListView.InsertItemPosition = InsertItemPosition.None;
            //    ListView.DataSource = DAORestaurant.GetRestaurants();
            //    ListView.DataBind();
            //    break;

            //case "Articles":
            //    Session["Restaurant"] = e.CommandArgument.ToString();
            //    Control ArticlesCtrl = LoadControl("~/Controls/Article.ascx");
            //    ListViewItem Item = (ListViewItem)e.Item;
            //    Item.FindControl("CtrlPlaceHolder").Controls.Add(ArticlesCtrl);
        //}

    //}

    protected void closeButton_Click(object sender, EventArgs e)
    {

    }

    protected void newArticleButton_Click(object sender, EventArgs e)
    {

    }

    protected void NewRestaurantBtn_Click(object sender, EventArgs e)
    {
        ListView.InsertItemPosition = InsertItemPosition.LastItem;
        //SetDataSource();
        //ListView.DataBind();        
    }

    protected void ValidateName(object source, ServerValidateEventArgs args)
    {
        string NameTxt = ((TextBox)(ListView.InsertItem.FindControl("NameTextBox"))).Text.Trim();
        args.IsValid = (NameTxt.Length > 2 && NameTxt.Length < 51);
    }

    protected void ValidateUniqueness(object source, ServerValidateEventArgs args)
    {
        string NameTxt = ((TextBox)(ListView.InsertItem.FindControl("NameTextBox"))).Text.Trim();
        args.IsValid = DAORestaurant.IsUnique(NameTxt);
    }

    protected void ValidatePhone(object source, ServerValidateEventArgs args)
    {
        string PhoneTxt = ((TextBox)(ListView.InsertItem.FindControl("PhoneTextBox"))).Text.Trim();
        Regex regex = new Regex(@"^\d{3}\s\d{3}\s\d{3}$");
        args.IsValid = regex.IsMatch(PhoneTxt);
    }

    protected void ValidateEmail(object source, ServerValidateEventArgs args)
    {
        string EmailTxt = ((TextBox)(ListView.InsertItem.FindControl("EmailTextBox"))).Text.Trim();
        Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
        args.IsValid = regex.IsMatch(EmailTxt);
    }

    protected void ShowAllBtn_Click(object sender, EventArgs e)
    {            
        Session["ALL"] = true;
        ListView.DataSource = DAORestaurant.GetRestaurants();
        ListView.DataBind();
    }

    protected void FilterBtn_Click(object sender, EventArgs e)
    {
        string filterType = FilterTypeDDL.SelectedValue;
        string substring = StringTB.Text.Trim().ToUpper();
        Session["ALL"] = false;
        Session["FilterType"] = filterType;
        Session["Substring"] = substring;


        ListView.DataSource = DAORestaurant.GetRestaurants(substring, filterType);
        ListView.DataBind();
    }

    protected void ListView_ItemEditing(object sender, ListViewEditEventArgs e)
    {
        ListView.EditIndex = e.NewEditIndex;

        //SetDataSource();
        //ListView.DataBind();
    }

    protected void ListView_ItemInserting(object sender, ListViewInsertEventArgs e)
    {

    }

    protected void ListView_ItemCanceling(object sender, ListViewCancelEventArgs e)
    {
        if (e.CancelMode == ListViewCancelMode.CancelingInsert)
        {
            ListView.InsertItemPosition = InsertItemPosition.None;
        }
        else
        {
            ListView.EditIndex = -1;                
        }

        //SetDataSource();
        //ListView.DataBind();
    }

    private void SetDataSource()
    {
        if ((bool)Session["ALL"])
        {
            ListView.DataSource = DAORestaurant.GetRestaurants();
        }
        else
        {
            ListView.DataSource = DAORestaurant.GetRestaurants((string)Session["Substring"], (string)Session["FilterType"]);
        }            
    }

コメントアウトされたコードは以前使用していたもので、現在表示されているものに切り替えましたが、問題は解決していません。各イベントでコメントされた2行のコメントを外した場合にのみ、変更が即座に適用されますが、そのような方法を何度も使用できないことはわかっています。

4

1 に答える 1

0

実行順序のためです。Page_Loadイベントで設定してみてください:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack &&
        !string.IsNullOrEmpty(Request.Form[NewRestaurantBtn.ClientID]))
    {
        ListView.InsertItemPosition = InsertItemPosition.LastItem;
    }
}
于 2013-05-12T19:59:20.407 に答える