摘要:開窗取值2 - 程式開發
需要兩個網頁(皆為Asp.net WebForm,小弟還不會MVC),一為主頁(後稱為A頁),一為開窗頁(後稱為B頁)
1、A頁需要四個控件,三個為前端(HTML),一個為後端(ASP.NET)
<div>
<input type='button' onclick='Open();' value='Add' id='ibtnAdd' />
<input type='button' onclick='Delete();' value='Delete' id='ibtnDelete' />
<table style="border: 2px black solid;" rules="all" cellpadding='5' id='GroupTable'>
<tr>
<td>
選取
</td>
<td>
編號
</td>
<td>
姓名
</td>
</tr>
</table>
<asp:TextBox runat="server" ID="txtData" TextMode="MultiLine" Height="150px" Width="250px"
Enabled="false" />
</div>
有一個後端的控件是為PostBack的時候,可以抓到其值,這樣就可以存檔。
2、B頁需要兩個後端的控件,只要可以取得值用什麼控件並不限定,只是小弟用下列兩個控件做比較快!
<table>
<tr>
<td colspan="2">
<asp:Button ID="btnSave" runat="server" Text="確定" OnClick="btnSave_Click" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:GridView ID="gvDetail" runat="server" AutoGenerateColumns="False" BackColor="White"
BorderColor="White" BorderStyle="Ridge" BorderWidth="2px" CellPadding="3" CellSpacing="1"
GridLines="None" Width ="250px">
<RowStyle BackColor="#DEDFDE" ForeColor="Black" />
<Columns>
<asp:TemplateField HeaderText="選用">
<ItemTemplate>
<asp:CheckBox ID="cbSelect" runat="server" />
</ItemTemplate>
<ItemStyle Width="40px" />
</asp:TemplateField>
<asp:BoundField DataField="No" HeaderText="編號" ItemStyle-HorizontalAlign="Center">
<ItemStyle HorizontalAlign="Center" Width="80px" />
</asp:BoundField>
<asp:BoundField ControlStyle-BackColor="Yellow" DataField="Name" HeaderText="名稱"
ItemStyle-HorizontalAlign="Center">
<ControlStyle BackColor="Yellow"></ControlStyle>
<ItemStyle HorizontalAlign="Center" Width="120px" />
</asp:BoundField>
</Columns>
<FooterStyle BackColor="#C6C3C6" ForeColor="Black" />
<PagerStyle BackColor="#C6C3C6" ForeColor="Black" HorizontalAlign="Right" />
<SelectedRowStyle BackColor="#9471DE" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#E7E7FF" />
</asp:GridView>
</td>
</tr>
</table>
3、B頁後端需要撰寫程式,如下
using Newtonsoft.Json; < 需要找一個Newtonsoft.Json.dll,上Google一下就會有答案
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack == false)
{
GetGVData();
}
}
將有被選取的資料,存到Json格式
protected void btnSave_Click(object sender, EventArgs e)
{
List<DataObj> tObjList = new List<DataObj>();
foreach (GridViewRow tGVr in gvDetail.Rows)
{
CheckBox tCB = (CheckBox)tGVr.Cells[0].FindControl("cbSelect");
if (tCB.Checked == true)
{
需要自己建立資料類別 DataObj
DataObj tObj = new DataObj();
tObj.No = tGVr.Cells[1].Text.Trim();
tObj.Name = tGVr.Cells[2].Text.Trim();
tObjList.Add(tObj);
}
}
string tResultJson = JsonConvert.SerializeObject(tObjList);
this.Page.Controls.Add(new LiteralControl(string.Format("<script>window.opener.SetTable('{0}'); window.close();</script>", tResultJson)));
}
造假資料的地方,這裡可以修改成取存DB的程式
private void GetGVData()
{
DataTable tDt = new DataTable();
tDt.Columns.Add(new DataColumn("No", typeof(string)));
tDt.Columns.Add(new DataColumn("Name", typeof(string)));
DataRow tDr = tDt.NewRow();
tDr["No"] = "001";
tDr["Name"] = "Johnny";
tDt.Rows.Add(tDr);
tDr = tDt.NewRow();
tDr["No"] = "002";
tDr["Name"] = "Mary";
tDt.Rows.Add(tDr);
tDr = tDt.NewRow();
tDr["No"] = "003";
tDr["Name"] = "Tim";
tDt.Rows.Add(tDr);
tDr = tDt.NewRow();
tDr["No"] = "004";
tDr["Name"] = "Steven";
tDt.Rows.Add(tDr);
tDr = tDt.NewRow();
tDr["No"] = "005";
tDr["Name"] = "Brain";
tDt.Rows.Add(tDr);
gvDetail.DataSource = tDt;
gvDetail.DataBind();
}
建立一個存放Json的Class,這裡要注意的是,類別的屬性名稱要與DataTable的欄位名稱一樣!
public class DataObj
{
private string gNo = "";
private string gName = "";
public DataObj() { }
public string No
{
get
{
return gNo;
}
set
{
gNo = value;
}
}
public string Name
{
get
{
return gName;
}
set
{
gName = value;
}
}
}
4、A頁需要引用JQuery,當然如果JavaScript熟悉的話,也可以不引用JQuery
<script type="text/javascript" src="<%=ResolveUrl("~/js/jquery-2.1.1.min.js")%>"></script>
<script type="text/javascript">
開啟資料窗
function Open() {
window.open('OpenWinData.aspx', null, 'width=320, height=300, top=100, left=200, resizable=yes,menubar=no,toolbar=no,location=no,directories=no,status=no,scrollbars=yes');
}
設定資料 Table
function SetTable(pJsonData) {
if (pJsonData != '') {
var tJsonObj = JSON.parse(pJsonData);
第一次新增Table
if ($('#<%=txtData.ClientID %>').val() == '') {
InitTable(tJsonObj);
$('#<%=txtData.ClientID %>').val(pJsonData);
}
else {
$.each(tJsonObj, function(i, item) {
var tAppendCheck = AppendCheck(item.No);
if (tAppendCheck == false) {
新增一筆資料 隱藏欄位
AppendData(item);
var tNewObjList = JSON.parse($('#<%=txtData.ClientID %>').val());
新增一筆資料 Table
InitTable(tNewObjList);
}
else {
alert('編號' + item.No + '重複');
}
});
}
}
}
刪除資料時
function Delete() {
var tJsonObj = JSON.parse($('#<%=txtData.ClientID %>').val());
var i = 0;
$('#GroupTable tr').each(function() {
if (i > 0) {
var tRow = $(this);
if (tRow.find('input[type="checkbox"]').is(':checked')) {
tRow.remove();
splice(第n個元素, 刪除n個值)
tJsonObj.splice(i - 1, 1);
i--;
}
}
i++;
});
$('#<%=txtData.ClientID %>').val(JSON.stringify(tJsonObj));
}
檢查加入的資料是否有重複
function AppendCheck(pAppendKey) {
true 有重複;False 沒有重複
var tResult = false;
var tOriJsonObj = JSON.parse($('#<%=txtData.ClientID %>').val());
$.each(tOriJsonObj, function(i, item) {
if (pAppendKey == item.No) {
tResult = true;
}
});
return tResult;
}
新增一筆資料 隱藏欄位
function AppendData(pObj) {
var tOriJsonObj = JSON.parse($('#<%=txtData.ClientID %>').val());
tOriJsonObj.push(pObj);
$('#<%=txtData.ClientID %>').val(JSON.stringify(tOriJsonObj));
}
初始化資料 Table
function InitTable(pObjList) {
$('#GroupTable tr').each(function(i) {
if (i > 0) {
var tRow = $(this);
tRow.remove();
}
});
$.each(pObjList, function(i, item) {
$("#GroupTable").append("<tr>" +
"<td>" + "<input type='checkbox'>" + "</td>" +
"<td>" + item.No + "</td>" +
"<td>" + item.Name + "</td>" +
"</tr>");
});
}
等網頁載完(PostBack)後要做的事
$(function() {
var tJsonObj = JSON.parse($('#<%=txtData.ClientID %>').val());
InitTable(tJsonObj);
});
</script>
以上便可以完成其劇情應用,小弟對網頁設計的概念總是一知半解,若其中有什麼可以修正的(應該很多吧),
請指導一下小弟,非常感謝!