close

情境模擬如示意圖 : 點擊GridView上的TextBox後,要帶出ModalPopupExtender,勾選ModalPopupExtender上的選項後再將值寫回Textbox上。

2011-7-5 20-50-27.png    

看似簡單的問題,卻也讓我折騰了好幾小時。所幸經過一番努力,終於TRY出來了。
解法如下 :
一、在Textbox旁邊,設置了一顆隱藏按鈕(display:none),給它個CommandName,CommandArgument抓的是GridView的row index,等等要在RowCommand Event裡要用到。若ModalPopupExtender出來的畫面是包在UpdatePanel中,在ModalPopupExtender的屬性裡,OkControlID、CancelControlID這兩個屬性不能設,好讓確定按鈕或取消按鈕以ajax的方式傳回。

<ItemTemplate>
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
   
<cc1:ModalPopupExtender ID="TextBox2_ModalPopupExtender" runat="server"  PopupControlID="Panel1"
        
DynamicServicePath="" Enabled="True" TargetControlID="TextBox2" BackgroundCssClass="modalBackground" >
   
</cc1:ModalPopupExtender>
   
<asp:Button ID="Button1" runat="server" style="display:none" Text="Button" CommandName="Show" CommandArgument="<%#Container.DataItemIndex  %>" />                        </ItemTemplate>

二、在GridView_RowDataBound時,找到TextBox2,並利用GetPostBackEventReference方法,自訂TextBox2的click事件,說白了點就是透過隱藏按鈕去作click的動作,但我們不在Button1_Click裡寫程式,只是利用Button1作PostBack的動作,好回到RowCommand Event。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
   
ClientScriptManager cs = Page.ClientScript;
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
         TextBox txtLike = e.Row.FindControl("TextBox2") as TextBox;
         Button btn_hidden = e.Row.FindControl("Button1") as Button;
         txtLike.Attributes["onclick"] = cs.GetPostBackEventReference(btn_hidden, null);
    }
}

三、在Grid_RowCommand時,create一個ViewState裝目前GridView Selected Row,然後show ModalPopupExtender。

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
        int rowindex = Convert.ToInt16(e.CommandArgument);
        ViewState["SelectRowIndex"] = rowindex;
        ModalPopupExtender mde_textbox2 = (ModalPopupExtender)GridView1.Rows[rowindex].FindControl("TextBox2_ModalPopupExtender");
        mde_textbox2.Show();
}

四、在勾選完ModalPopupExtender的選項後,要將選取值寫回GridView Selected Row,這時就得取出ViewState所記錄的row number了。

protected void btnOK_Click(object sender, EventArgs e)
{
        string str = "";
        int row = Convert.ToInt16(ViewState["SelectRowIndex"]);
        foreach (GridViewRow r in GridView2.Rows)
        {
            CheckBox chx = r.FindControl("chxbox") as CheckBox;
            if (chx.Checked)
            {
                Label lblLike =r.FindControl("Label2") as Label;
                str += lblLike.Text + ",";
                chx.Checked = false;
            }
        }
        str = str.Substring(0, str.Length - 1);
        TextBox txtLike = GridView1.Rows[row].FindControl("TextBox2") as TextBox;
        txtLike.Text = str;
  }

arrow
arrow
    創作者介紹
    創作者 忙裡偷閒 的頭像
    忙裡偷閒

    忙裡偷閒的部落格

    忙裡偷閒 發表在 痞客邦 留言(0) 人氣()