CreateUserWizard + DropDownList 使用AutoPostBack及OnSelectedIndexChanged 無反應
這個問題真的很怪,正常的狀況下AutoPostBack之後一定會去執行OnSelectedIndexChanged ,但掛在預設的CreateUserWizard 內使用時卻無反應。
解決的方式是把CreateUserWizard 內的 ViewStateMode="Disabled" 移除,就正常執行了。
因為在asp.net 3.5 的狀況下 ListView沒有提供分頁的功能。
一般的做法都是用以下兩種方式:
(1)ListView + DataPager + LinqDataSource
(2)ListView + DataPager + SQLDataSource
但因為資料來源不是從LinqDataSource或SQLDataSource取得,所以使用DataPager 造成很多不必要的麻煩,改用ListView +GridView 的方式,雖然會浪費資源及效能但同樣可以執成同樣的效果。
一、ASPX新增及建立
1.GridView 的相關設定,並且在Columns新增一個項目,利用CSS做隱藏
<pre class='codeblock'>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" GridLines ="None" onpageindexchanging="GridView1_PageIndexChanging" onrowdatabound="GridView1_RowDataBound" >
<PagerSettings FirstPageText="_FirstPage" LastPageText="_LastPage" Mode="NumericFirstLast" NextPageText="_NextPage" PreviousPageText="_PreviousPage" PageButtonCount="2" />
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name"
ReadOnly="True" ItemStyle-cssclass="hiddencol" HeaderStyle-CssClass="hiddencol">
<HeaderStyle CssClass="hiddencol"></HeaderStyle>
<ItemStyle CssClass="hiddencol"></ItemStyle>
</Columns>
<FooterStyle HorizontalAlign ="Left" />
<PagerStyle HorizontalAlign="Center" Font-Size="10" BackColor="#ffffff" ForeColor="#0072BC" Wrap="False" CssClass="PagerCss"></PagerStyle>
</asp:GridView>
</pre>
2.增加CSS
<pre class='codeblock'>
<style type="text/css">
.hiddencol
{
display:none;
}
.viscol
{
display:block;
}
.PagerCss TD A:hover { width: 20px; color: blue; }
.PagerCss TD A:active { width: 20px; color: black; }
.PagerCss TD A:link {width: 20px; color: Green;}
.PagerCss TD A:visited { width: 20px; color:black ; }
.PagerCss TD SPAN { font-weight: bold; font-size: 25px; width: 20px; color: red; background-color:Silver ; }
</style>
</pre>
3.ListView相關設定
<pre class='codeblock'>
<asp:ListView ID="ListView1" runat="server" onitemdatabound="ListView1_ItemDataBound">
<LayoutTemplate>
<span ID="itemPlaceholder" runat="server"></span>
</LayoutTemplate>
<ItemTemplate>
<asp:Label ID="Name" runat="server" Text='<%# Eval("Name") %>'></asp:Label>
</ItemTemplate>
</asp:ListView>
</pre>
二、Code Behind新增及建立
1.建立全域變數的DataTable 及DataView
<pre class='codeblock'>
public partial class Page : System.Web.UI.UserControl
{
public DataTable dt= new DataTable();
public DataView dv = new DataView();
}
</pre>
2.建立DataTable 的結構,並取得資料來源。
<pre class='codeblock'>
protected void Page_Load(object sender, EventArgs e)
{
dt.Columns.Add("Name");
dv = dt.DefaultView;
DataView dvSource = GetSource();
GridView1.DataSource = dvSource ;
GridView1.DataBind();
ListView1.DataSource = dv;
ListView1.DataBind();
}
</pre>
3.
<pre class='codeblock'>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRow dr = dv.Table.NewRow();
dr["Name"] = DataBinder.Eval(e.Row.DataItem, "Name") as string;
dv.Table.Rows.Add(dr);
}
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.EditIndex = -1;
GridView1.PageIndex = e.NewPageIndex;
dt.Columns.Add("Name");
dv = dt.DefaultView;
DataView dvSource = GetSource();
GridView1.DataSource = dvSource ;
GridView1.DataBind();
ListView1.DataSource = dv;
ListView1.DataBind();
}
protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
Label Name = (e.Item.FindControl("Name") as Label);
string Name = DataBinder.Eval(dataItem.DataItem, "Name ").ToString();
}
</pre>
參考資料 :
http://charlesbc.blogspot.tw/2010/05/iqueryable-gridview-rowdatabound.html
http://www.dotblogs.com.tw/dennismao/archive/2009/08/10/9977.aspx?fid=16726
http://kennyfan88.pixnet.net/blog/post/84881604-%E4%BD%BF%E7%94%A8datatable%E5%8A%A0%E5%85%A5%E6%AC%84%E4%BD%8D%E3%80%81%E6%96%B0%E5%A2%9E%E6%AC%84%E4%BD%8D%E5%90%84%E8%B3%87%E6%96%99%E5%88%97
一般的做法都是用以下兩種方式:
(1)ListView + DataPager + LinqDataSource
(2)ListView + DataPager + SQLDataSource
但因為資料來源不是從LinqDataSource或SQLDataSource取得,所以使用DataPager 造成很多不必要的麻煩,改用ListView +GridView 的方式,雖然會浪費資源及效能但同樣可以執成同樣的效果。
一、ASPX新增及建立
1.GridView 的相關設定,並且在Columns新增一個項目,利用CSS做隱藏
<pre class='codeblock'>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" GridLines ="None" onpageindexchanging="GridView1_PageIndexChanging" onrowdatabound="GridView1_RowDataBound" >
<PagerSettings FirstPageText="_FirstPage" LastPageText="_LastPage" Mode="NumericFirstLast" NextPageText="_NextPage" PreviousPageText="_PreviousPage" PageButtonCount="2" />
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name"
ReadOnly="True" ItemStyle-cssclass="hiddencol" HeaderStyle-CssClass="hiddencol">
<HeaderStyle CssClass="hiddencol"></HeaderStyle>
<ItemStyle CssClass="hiddencol"></ItemStyle>
</Columns>
<FooterStyle HorizontalAlign ="Left" />
<PagerStyle HorizontalAlign="Center" Font-Size="10" BackColor="#ffffff" ForeColor="#0072BC" Wrap="False" CssClass="PagerCss"></PagerStyle>
</asp:GridView>
</pre>
2.增加CSS
<pre class='codeblock'>
<style type="text/css">
.hiddencol
{
display:none;
}
.viscol
{
display:block;
}
.PagerCss TD A:hover { width: 20px; color: blue; }
.PagerCss TD A:active { width: 20px; color: black; }
.PagerCss TD A:link {width: 20px; color: Green;}
.PagerCss TD A:visited { width: 20px; color:black ; }
.PagerCss TD SPAN { font-weight: bold; font-size: 25px; width: 20px; color: red; background-color:Silver ; }
</style>
</pre>
3.ListView相關設定
<pre class='codeblock'>
<asp:ListView ID="ListView1" runat="server" onitemdatabound="ListView1_ItemDataBound">
<LayoutTemplate>
<span ID="itemPlaceholder" runat="server"></span>
</LayoutTemplate>
<ItemTemplate>
<asp:Label ID="Name" runat="server" Text='<%# Eval("Name") %>'></asp:Label>
</ItemTemplate>
</asp:ListView>
</pre>
二、Code Behind新增及建立
1.建立全域變數的DataTable 及DataView
<pre class='codeblock'>
public partial class Page : System.Web.UI.UserControl
{
public DataTable dt= new DataTable();
public DataView dv = new DataView();
}
</pre>
2.建立DataTable 的結構,並取得資料來源。
<pre class='codeblock'>
protected void Page_Load(object sender, EventArgs e)
{
dt.Columns.Add("Name");
dv = dt.DefaultView;
DataView dvSource = GetSource();
GridView1.DataSource = dvSource ;
GridView1.DataBind();
ListView1.DataSource = dv;
ListView1.DataBind();
}
</pre>
3.
<pre class='codeblock'>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRow dr = dv.Table.NewRow();
dr["Name"] = DataBinder.Eval(e.Row.DataItem, "Name") as string;
dv.Table.Rows.Add(dr);
}
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.EditIndex = -1;
GridView1.PageIndex = e.NewPageIndex;
dt.Columns.Add("Name");
dv = dt.DefaultView;
DataView dvSource = GetSource();
GridView1.DataSource = dvSource ;
GridView1.DataBind();
ListView1.DataSource = dv;
ListView1.DataBind();
}
protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
Label Name = (e.Item.FindControl("Name") as Label);
string Name = DataBinder.Eval(dataItem.DataItem, "Name ").ToString();
}
</pre>
參考資料 :
http://charlesbc.blogspot.tw/2010/05/iqueryable-gridview-rowdatabound.html
http://www.dotblogs.com.tw/dennismao/archive/2009/08/10/9977.aspx?fid=16726
http://kennyfan88.pixnet.net/blog/post/84881604-%E4%BD%BF%E7%94%A8datatable%E5%8A%A0%E5%85%A5%E6%AC%84%E4%BD%8D%E3%80%81%E6%96%B0%E5%A2%9E%E6%AC%84%E4%BD%8D%E5%90%84%E8%B3%87%E6%96%99%E5%88%97
在TextBox按下鍵盤上Enter後自動執行某一個button click
會發生這個狀況是因為程式會自動執行Postback,並且當頁面內有button物件時,就會執行button click。
參考資料:
http://www.cnblogs.com/jiajiayuan/archive/2011/08/26/2154596.html
http://wellylin.blogspot.tw/2012/02/aspnet-form-submit-keypress-by-enter.html
解決的方式,可以利用panel預設default button或是利用javascript阻擋。
(1)利用panel預設default button
<asp:Panel ID="asp:Panel1" runat="server" DefaultButton="btDefaultButton">
<asp:Button ID="btDefaultButton" runat="server" Text="_DefaultButton" style="display:none" />
</asp:Panel>
參考資料:
http://eos45.pixnet.net/blog/post/48273310-asp.net-%E8%AE%93-enter-%E7%84%A1%E6%95%88
(2)利用javascript阻擋
txtTitle.Attributes.Add("onkeypress", "if( event.keyCode == 13 ) { return false; }");
參考資料:
http://demo.tc/Post/233
(3)利用javascript指定執行的button click
Me.txt_pass.Attributes.Add("onkeypress", "if( event.keyCode == 13 ) {"& Me.ClientScript.GetPostBackEventReference(Me.btn_pass, "")& "}")
參考資料:
http://blog.xuite.net/tolarku/blog/39441722-TextBox+%E8%BC%B8%E5%85%A5%E5%AE%8C%E6%8C%89%E4%B8%8B+Enter+%E8%A7%B8%E7%99%BC%E6%8C%89%E9%88%95%E4%BA%8B%E4%BB%B6
http://nelsonkai.blogspot.tw/2008/12/text-boxentersend.html
(4)利用javascript在 Enter 鍵被按下時,改成 Tab 鍵
參考資料:
http://charlesbc.blogspot.tw/2009/06/aspnet-enter-tab.html
(5)利用 form defaultbutton
<asp:Button ID="btDefaultButton" runat="server" Text="_DefaultButton" style="display:none" />
this.Form.DefaultButton = btDefaultButton.UniqueID;
btDefaultButton.Style.Add("display", "none");
會發生這個狀況是因為程式會自動執行Postback,並且當頁面內有button物件時,就會執行button click。
參考資料:
http://www.cnblogs.com/jiajiayuan/archive/2011/08/26/2154596.html
http://wellylin.blogspot.tw/2012/02/aspnet-form-submit-keypress-by-enter.html
解決的方式,可以利用panel預設default button或是利用javascript阻擋。
(1)利用panel預設default button
<asp:Panel ID="asp:Panel1" runat="server" DefaultButton="btDefaultButton">
<asp:Button ID="btDefaultButton" runat="server" Text="_DefaultButton" style="display:none" />
</asp:Panel>
參考資料:
http://eos45.pixnet.net/blog/post/48273310-asp.net-%E8%AE%93-enter-%E7%84%A1%E6%95%88
(2)利用javascript阻擋
txtTitle.Attributes.Add("onkeypress", "if( event.keyCode == 13 ) { return false; }");
參考資料:
http://demo.tc/Post/233
(3)利用javascript指定執行的button click
Me.txt_pass.Attributes.Add("onkeypress", "if( event.keyCode == 13 ) {"& Me.ClientScript.GetPostBackEventReference(Me.btn_pass, "")& "}")
參考資料:
http://blog.xuite.net/tolarku/blog/39441722-TextBox+%E8%BC%B8%E5%85%A5%E5%AE%8C%E6%8C%89%E4%B8%8B+Enter+%E8%A7%B8%E7%99%BC%E6%8C%89%E9%88%95%E4%BA%8B%E4%BB%B6
http://nelsonkai.blogspot.tw/2008/12/text-boxentersend.html
(4)利用javascript在 Enter 鍵被按下時,改成 Tab 鍵
參考資料:
http://charlesbc.blogspot.tw/2009/06/aspnet-enter-tab.html
(5)利用 form defaultbutton
<asp:Button ID="btDefaultButton" runat="server" Text="_DefaultButton" style="display:none" />
this.Form.DefaultButton = btDefaultButton.UniqueID;
btDefaultButton.Style.Add("display", "none");
預設的會員登入機制是在App_Data資料夾內建立ASPNETDB.MDF,因為是需要上線的會員登入機制,希望能將資料轉存至SQL Server內。
1.轉移的方式,主要是使用ASP.NET 附加資料庫轉移工具:Aspnet_reqsql.exe
路徑:C:\Windows\Microsoft.NET\Framework\v2.0.50727
參考:http://msdn.microsoft.com/en-us/library/ms229862.ASPX
2.移轉的安裝步驟可以參考以下資料:
http://www.dotblogs.com.tw/keigen/archive/2012/02/01/67152.aspx
(1)大部份都是執行「下一步」
(2)選擇「設定應用程式服務的SQL Server」
(2)輸入「伺服器名稱」
(3)選擇「Windows驗證」或是「SQL Server驗證(輸入使用者名稱及密碼)」
(4)選擇資料庫
(5)之後就都是「下一步」
(6)最後就是「完成」
參考資料:http://www.studiocoast.com.au/knowledgebase/6/aspnet/using-sql-server-instead-of-aspnetdbmdf.aspx
3.檢查SQL Server資料表,應該會有11個aspnet_XXXXXX名稱的資料表
4.因為資料庫的位置從App_Data下的ASPNETDB.MDF,移轉到SQL Server所以要重新設定Web.config的資料庫連接字串。
<connectionStrings>
<add name="UserAspNetConnectionString" connectionString="Data Source=xxxx\SQLEXPRESS;Initial Catalog=aspnetdb;User ID=xxxxxx;Password=xxxxxx;Min Pool Size=10;Max Pool Size=1000;Pooling=false;Connect Timeout=45;" providerName="System.Data.SqlClient" />
</connectionStrings>
5.設定Provider的連接字串(藍字的UserAspNetConnectionString)。
<profile defaultProvider="DefaultProfileProvider" enabled="true">
<providers>
<add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="UserAspNetConnectionString" applicationName="/" />
</providers>
<properties>
<add name="FirstName" type="System.String"/>
<add name="LastName" type="System.String"/>
</properties>
</profile>
<membership defaultProvider="DefaultMembershipProvider">
<providers>
<add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="UserAspNetConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
</providers>
</membership>
<roleManager defaultProvider="DefaultRoleProvider" enabled="true">
<providers>
<add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="UserAspNetConnectionString" applicationName="/" />
</providers>
</roleManager>
參考資料:
http://www.dotblogs.com.tw/dislin/archive/2010/07/28/16868.aspx
http://dnowba.blogspot.tw/2011/10/blog-post_3144.html
http://www.dotblogs.com.tw/topcat/archive/2008/06/02/4201.aspx
http://dnowba.blogspot.tw/2011/10/blog-post_3144.html
1.轉移的方式,主要是使用ASP.NET 附加資料庫轉移工具:Aspnet_reqsql.exe
路徑:C:\Windows\Microsoft.NET\Framework\v2.0.50727
參考:http://msdn.microsoft.com/en-us/library/ms229862.ASPX
2.移轉的安裝步驟可以參考以下資料:
http://www.dotblogs.com.tw/keigen/archive/2012/02/01/67152.aspx
(1)大部份都是執行「下一步」
(2)選擇「設定應用程式服務的SQL Server」
(2)輸入「伺服器名稱」
(3)選擇「Windows驗證」或是「SQL Server驗證(輸入使用者名稱及密碼)」
(4)選擇資料庫
(5)之後就都是「下一步」
(6)最後就是「完成」
參考資料:http://www.studiocoast.com.au/knowledgebase/6/aspnet/using-sql-server-instead-of-aspnetdbmdf.aspx
3.檢查SQL Server資料表,應該會有11個aspnet_XXXXXX名稱的資料表
4.因為資料庫的位置從App_Data下的ASPNETDB.MDF,移轉到SQL Server所以要重新設定Web.config的資料庫連接字串。
<connectionStrings>
<add name="UserAspNetConnectionString" connectionString="Data Source=xxxx\SQLEXPRESS;Initial Catalog=aspnetdb;User ID=xxxxxx;Password=xxxxxx;Min Pool Size=10;Max Pool Size=1000;Pooling=false;Connect Timeout=45;" providerName="System.Data.SqlClient" />
</connectionStrings>
5.設定Provider的連接字串(藍字的UserAspNetConnectionString)。
<profile defaultProvider="DefaultProfileProvider" enabled="true">
<providers>
<add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="UserAspNetConnectionString" applicationName="/" />
</providers>
<properties>
<add name="FirstName" type="System.String"/>
<add name="LastName" type="System.String"/>
</properties>
</profile>
<membership defaultProvider="DefaultMembershipProvider">
<providers>
<add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="UserAspNetConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
</providers>
</membership>
<roleManager defaultProvider="DefaultRoleProvider" enabled="true">
<providers>
<add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="UserAspNetConnectionString" applicationName="/" />
</providers>
</roleManager>
參考資料:
http://www.dotblogs.com.tw/dislin/archive/2010/07/28/16868.aspx
http://dnowba.blogspot.tw/2011/10/blog-post_3144.html
http://www.dotblogs.com.tw/topcat/archive/2008/06/02/4201.aspx
http://dnowba.blogspot.tw/2011/10/blog-post_3144.html