情境模擬如示意圖 : 點擊GridView上的TextBox後,要帶出ModalPopupExtender,勾選ModalPopupExtender上的選項後再將值寫回Textbox上。
看似簡單的問題,卻也讓我折騰了好幾小時。所幸經過一番努力,終於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;
}