none
请教一下formview中的问题 RRS feed

  • 问题

  • 我正在弄一个数据上传的页面。用到了formview控件。其InsertItenTemlate部分的代码如下:

    <InsertItemTemplate>
                            class:
                            <asp:TextBox ID="classTextBox" runat="server" Text='<%# Bind("class") %>' />
                            <br />
                            title:
                            <asp:TextBox ID="titleTextBox" runat="server" Text='<%# Bind("title") %>' />
                            <br />
                            author:
                            <asp:TextBox ID="authorTextBox" runat="server" Text='<%# Bind("author") %>' />
                            <br />
                            pushtime:
                            <asp:TextBox ID="pushtimeTextBox" runat="server"
                                Text='<%# Bind("pushtime") %>' />
                            <br />
                            content:
                            <asp:TextBox ID="contentTextBox" runat="server" Text='<%# Bind("content") %>' />
                            <br />
                            <asp:LinkButton ID="InsertButton" runat="server" CommandName="Insert" Text="插入" />
    &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False"
                                CommandName="Cancel" Text="取消" />
                        </InsertItemTemplate>

    如果不为那个“插入”按钮设置postBackUrl,就能正常上传到数据库,但是如果设置了PostBackUrl之后页面能跳转,但是数据不能上传到数据库。我想请问一下这是怎么回事呢?我如何能够正常上传数据,同时点击插入后能够成功跳转到指定的页面呢?如果解决了,我还想请问一下,把content后面的文本框替换城FCKeditor控件后,为什么没有可以绑定到数据库“congtent”字段的text属性?

    哦,对了,我用的是visual web developer 2008速成版,语言是VB.

    呵呵,问题有点多,第一次做这个。希望能够谅解。呵呵。再次感谢各位看问题的人和帮助我解决问题的人。


    2011年8月21日 15:40

答案

    1. 經過模擬你的情境,的確在插入按鈕上設定PostBackUrl的確會直接Redirect到PostBackUrl所指定的頁面,或許你可以考慮在FormView的ItemInserted先判斷e.AffectedRows,大於 0表示新增成功在Redirect到下一個頁面,例如下面的程式碼片段:
      protected void FormView1_ItemInserted(object sender, FormViewInsertedEventArgs e)
      {
      	if (e.AffectedRows > 0)
      		Response.Redirect("~/WebForm6.aspx");
      }
      
    2. 你可以使用Value屬性來取得FCKeditor的值或Binding。
      <FCKeditorV2:FCKeditor ID="FCKeditor1" runat="server" BasePath="~\FCKeditor\" 
      	Height="200px" Value='<%# Bind("content") %>' Width="100%" >
      </FCKeditorV2:FCKeditor>
      

    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已标记为答案 MessFangsi 2011年8月23日 2:57
    2011年8月21日 23:31
  • 呵呵,,我也用JS写过,只是没有你的if(pushtime!=null)的判断,不过如果我在pushtime 的textbox中不输入时间的话,还是不行(我设置pushtime字段不能为空)。请问一下还能做出怎样的修改才能使这个pushtime.value真正的自动写入那个textbox中,并且能够上传到数据库呢??

    不好意思,修正一下之前的程式碼,因為pushtime是放在FormView,所以JS要改成下列的樣子:

    var PushTime = document.getElementById('FormView1_pushtimeTextBox');
    
    另外從你的說明看起來,是不是以JS設定pushtime的客戶端日期沒有成功,導致要寫回資料庫時因為欄位不能為NULL所以新增失敗。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已标记为答案 MessFangsi 2011年8月23日 2:56
    2011年8月22日 22:54

全部回复

    1. 經過模擬你的情境,的確在插入按鈕上設定PostBackUrl的確會直接Redirect到PostBackUrl所指定的頁面,或許你可以考慮在FormView的ItemInserted先判斷e.AffectedRows,大於 0表示新增成功在Redirect到下一個頁面,例如下面的程式碼片段:
      protected void FormView1_ItemInserted(object sender, FormViewInsertedEventArgs e)
      {
      	if (e.AffectedRows > 0)
      		Response.Redirect("~/WebForm6.aspx");
      }
      
    2. 你可以使用Value屬性來取得FCKeditor的值或Binding。
      <FCKeditorV2:FCKeditor ID="FCKeditor1" runat="server" BasePath="~\FCKeditor\" 
      	Height="200px" Value='<%# Bind("content") %>' Width="100%" >
      </FCKeditorV2:FCKeditor>
      

    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已标记为答案 MessFangsi 2011年8月23日 2:57
    2011年8月21日 23:31
  • 你好,首先谢谢你。通过你的方法我解决了FCKeditor的问题。但是第一个那个formviewinserted事件,在页面中如何触发呢?我在我的页面(addAticle.aspx.vb)里写上你给的代码,但是不行。不知道为什么。。对咯,我用的是VB哦。


    2011年8月22日 2:47
  • 你好,首先谢谢你。通过你的方法我解决了FCKeditor的问题。但是第一个那个formviewinserted事件,在页面中如何触发呢?我在我的页面(addAticle.aspx.vb)里写上你给的代码,但是不行。不知道为什么。。对咯,我用的是VB哦。


    不好意思,我用的是C#,不過作法應該差不多,你可以在AddAticle.aspx上切換到設計模式,接著點選FormView後按F4來開啟屬性視窗,然後切換到事件標籤,找到ItemInsertedm事件於右側空白處點兩下就會幫你產生ItemInserted事件了。
    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月22日 2:51
  • 呵呵,,谢谢你了。问题解决了。想再请教一下,我想把那个pushtime改为自动获取客户端的系统时间,并且和其他数据一起上传到数据库,需要用一个Page_load事件吗?我知道js代码,但是不知道如何才能插入进去,希望你能给点意见。呵呵。谢谢。

     


    2011年8月22日 9:28
  • 呵呵,,谢谢你了。问题解决了。想再请教一下,我想把那个pushtime改为自动获取客户端的系统时间,并且和其他数据一起上传到数据库,需要用一个Page_load事件吗?我知道js代码,但是不知道如何才能插入进去,希望你能给点意见。呵呵。谢谢。

     


    請參考下列程式碼,不過一般會建議使用系統時間為主,尤其是時間對應用程式很重要的時候,用客戶端時間可能因為每個客戶端的時間不一致而導致非預期的結果。

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm11.aspx.cs" Inherits="WebApplication1.WebForm11" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>  
    </head>
    <body>
      <form id="form1" runat="server">
      <div>
        <asp:TextBox ID="pushtimeTextBox" runat="server"></asp:TextBox>
      </div>
      </form>
    </body>
      <script type="text/javascript">
        var PushTime = document.getElementById('pushtimeTextBox');
        if (PushTime != null) {
          var currentTime = new Date();
          var month = currentTime.getMonth() + 1;
          var day = currentTime.getDate();
          var year = currentTime.getFullYear();
          PushTime.value = month + "/" + day + "/" + year;
        }
      </script>
    </html>
    
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月22日 10:01
  • 呵呵,,我也用JS写过,只是没有你的if(pushtime!=null)的判断,不过如果我在pushtime 的textbox中不输入时间的话,还是不行(我设置pushtime字段不能为空)。请问一下还能做出怎样的修改才能使这个pushtime.value真正的自动写入那个textbox中,并且能够上传到数据库呢??
    2011年8月22日 16:32
  • 请这样试试

    1.每次网页读取完毕,把客户端的时间储存在HiddenField

    2.插入数据时候,SqlDataSource强制从HiddenField抓Value去写入

    3.既然是要插入客户端时间,那就不应该有文本框让User填写,把<InsertItemTemplate>裡的
       <asp:TextBox ID="pushtimeTextBox" runat="server" Text='<%# Bind("pushtime") %>' />
       拿掉

     

    参考代码如下:

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default8.aspx.vb" Inherits="Default8" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
     <title></title>
     <script src="js/jquery-1.4.1.min.js" type="text/javascript"></script>
     <script type="text/javascript">
    
      $(document).ready(init);
    
     function init() {
      var date = new Date();
      $("#<%= hf_ClientDate.ClientID %>").val(date.getYear() + "/" + (date.getMonth()+1) + "/" + date.getDate());
      /*把客户端的时间储存在HiddenField*/
    
     }
    
     </script>
    </head>
    <body>
     <form id="form1" runat="server">
     <asp:HiddenField runat="server" ID="hf_ClientDate" />
    
     <asp:SqlDataSource runat="server" ID="sds_Categories" 
      ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
      DeleteCommand="DELETE FROM [Categories] WHERE [CategoryID] = @CategoryID" 
      InsertCommand="INSERT INTO [Categories] ([pushtime], [Description], [CategoryName]) VALUES (@pushtime, @Description, @CategoryName)" 
      SelectCommand="SELECT [pushtime], [Description], [CategoryName], [CategoryID] FROM [Categories]" 
      UpdateCommand="UPDATE [Categories] SET [pushtime] = @pushtime, [Description] = @Description, [CategoryName] = @CategoryName WHERE [CategoryID] = @CategoryID" >
    
      <DeleteParameters>
      <asp:Parameter Name="CategoryID" Type="Int32" />
      </DeleteParameters>
    
      <InsertParameters>
      <asp:Parameter DbType="Date" Name="pushtime" />
      <asp:Parameter Name="Description" Type="String" />
      <asp:Parameter Name="CategoryName" Type="String" />
      </InsertParameters>
    
    
    
      <UpdateParameters>
      <asp:Parameter DbType="Date" Name="pushtime" />
      <asp:Parameter Name="Description" Type="String" />
      <asp:Parameter Name="CategoryName" Type="String" />
      <asp:Parameter Name="CategoryID" Type="Int32" />
      </UpdateParameters>
    
     </asp:SqlDataSource>
    
     <asp:FormView runat="server" DataKeyNames="CategoryID" ID="fv_Categories"
      DataSourceID="sds_Categories">
      <InsertItemTemplate>
    
     <!--拿掉pushtime,避免User填寫-->
      Description:
      <asp:TextBox ID="DescriptionTextBox" runat="server" 
      Text='<%# Bind("Description") %>' />
      <br />
      CategoryName:
      <asp:TextBox ID="CategoryNameTextBox" runat="server" 
      Text='<%# Bind("CategoryName") %>' />
      <br />
    
      <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" 
      CommandName="Insert" Text="插入" />
      &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server" 
      CausesValidation="False" CommandName="Cancel" Text="取消" />
     </InsertItemTemplate>
    
     <ItemTemplate>
    
      pushtime:
      <asp:Label ID="pushtimeLabel" runat="server" Text='<%# Bind("pushtime") %>' />
      <br />
      Description:
      <asp:Label ID="DescriptionLabel" runat="server" 
      Text='<%# Bind("Description") %>' />
      <br />
      CategoryName:
      <asp:Label ID="CategoryNameLabel" runat="server" 
      Text='<%# Bind("CategoryName") %>' />
      <br />
    
      CategoryID:
      <asp:Label ID="CategoryIDLabel" runat="server" 
      Text='<%# Eval("CategoryID") %>' />
      <br />
      &nbsp;<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" 
      CommandName="New" Text="新增" />
     </ItemTemplate>
    
     </asp:FormView>
    
     </form>
    </body>
    </html>
    
    Partial Class Default8
     Inherits System.Web.UI.Page
    
     Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    
    
     End Sub
    
     Protected Sub sds_Categories_Inserting(sender As Object, e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs) Handles sds_Categories.Inserting
    
     e.Command.Parameters("@pushtime").Value = hf_ClientDate.Value
    
     End Sub
    
    
    
    End Class
    

    Shadowと愉快なコード達


    2011年8月22日 17:22
  • 呵呵,,我也用JS写过,只是没有你的if(pushtime!=null)的判断,不过如果我在pushtime 的textbox中不输入时间的话,还是不行(我设置pushtime字段不能为空)。请问一下还能做出怎样的修改才能使这个pushtime.value真正的自动写入那个textbox中,并且能够上传到数据库呢??

    不好意思,修正一下之前的程式碼,因為pushtime是放在FormView,所以JS要改成下列的樣子:

    var PushTime = document.getElementById('FormView1_pushtimeTextBox');
    
    另外從你的說明看起來,是不是以JS設定pushtime的客戶端日期沒有成功,導致要寫回資料庫時因為欄位不能為NULL所以新增失敗。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已标记为答案 MessFangsi 2011年8月23日 2:56
    2011年8月22日 22:54
  • 哦,,原来是这个原因呢,,,呵呵,,我也说怎么都弄不出来呢。。呵呵,谢谢您了TerryChuang。以后还请多指教。
    2011年8月23日 2:56
  • 哦,,原来是这个原因呢,,,呵呵,,我也说怎么都弄不出来呢。。呵呵,谢谢您了TerryChuang。以后还请多指教。
    您客氣了,有機會再來互相切磋囉。
    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月23日 3:01
  • 呵呵,,我还是菜鸟呢,,自学了才两个月。。。还需要向你们这些大虾们好好学习的。
    2011年8月23日 6:31