2013-12-08 36 views
0

我有一個簡單的DetailsView控件連接到由兩個T-SQL查詢組成的數據源(可以正常工作)。但是,當我嘗試將模式(取決於URL中的id)更改爲Page_Load事件中的「編輯」時,沒有任何內容顯示,而「插入」工作正常。一切看起來都是數據綁定的。在Page_Load事件中更改DetailsViewModel

另外,如何從代碼隱藏(FindControl總是返回null出於某種原因)訪問BoundField值(文本本身)?我想在頁面加載時有一個默認值。

標記:

<body> 
    <form id="form1" runat="server"> 
    <div class="register" runat="server"> 
     <asp:DetailsView ID="DV" runat="server" HorizontalAlign="Center" 
      Height="100px" Width="170px" 
      AutoGenerateRows="False" DataSourceID="RegisterUser" 
      OnItemCommand="Button_click" 
      OnItemInserted="Insert_click" OnItemUpdated="Edit_click"> 
      <Fields> 
       <asp:BoundField DataField="username" HeaderText="Name" 
        SortExpression="username" /> 
       <asp:TemplateField HeaderText="Password"> 
        <EditItemTemplate> 
         <asp:TextBox ID="Password" runat="server" TextMode="Password" Text='<%# Bind("userPassword") %>'></asp:TextBox> 
        </EditItemTemplate> 
       </asp:TemplateField> 
       <asp:BoundField DataField="userEmail" HeaderText="Email" 
        SortExpression="userEmail" /> 
       <asp:CommandField ShowInsertButton="True" ShowEditButton="True" /> 
      </Fields> 
     </asp:DetailsView> 
     <asp:SqlDataSource ID="RegisterUser" runat="server" 
      ConnectionString="<%$ ConnectionStrings:usersConnectionString %>" 
      InsertCommand="INSERT INTO korisnik(username, userPassword, userEmail) VALUES (@username, @userPassword, @userEmail)" 
      UpdateCommand="UPDATE korisnik SET userPassword = @userPassword, userEmail = @userEmail WHERE (username = @username)"> 
      <InsertParameters> 
       <asp:Parameter Name="username" Type="String" /> 
       <asp:Parameter Name="userPassword" Type="String" /> 
       <asp:Parameter Name="userEmail" Type="String" /> 
      </InsertParameters> 
      <UpdateParameters> 
       <asp:Parameter Name="userPassword" Type="String" /> 
       <asp:Parameter Name="userEmail" Type="String" /> 
       <asp:Parameter Name="username" Type="String" /> 
      </UpdateParameters> 
     </asp:SqlDataSource> 
     <asp:Label ID="Message_label" ForeColor="red" Visible="false" runat="server" Text="[messageLabel]"></asp:Label> 
    </div> 
    </form> 
</body> 

代碼隱藏:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     string id = Request.QueryString["id"]; 
     // EDIT mode 
     if (id == "Change_data_button") 
     { 
      DV.DefaultMode = DetailsViewMode.Edit; 
      //DV.DataSource = RegisterUser; 
      //DV.DataBind(); 
      DV.Fields[0].Visible = false; // preventing the value from being changed (one cannot change a username) 

      /* found this snippet somewhere but FindControl returns null */ 
      TextBox user; 
      user = (TextBox)DV.FindControl("username"); 
      user.Text = Session["LoggedUser"].ToString(); 
     } 
     // INSERT mode 
     else if (id == "Register_button") 
     { 
      DV.DefaultMode = DetailsViewMode.Insert; 
     } 
    } 
} 

回答

0

首先,我沒有看到任何SelectCommand在設定SqlDataSource的控制名爲RegisterUser,我不認爲你將在DetailsView中的數據在EditMode中進行編輯。

所以,你必須設置的SelectCommand(也SelectParameters如果有他們),如下面的示例

<asp:SqlDataSource ID="RegisterUser" runat="server" 
      ConnectionString="<%$ ConnectionStrings:usersConnectionString %>" 
      SelectCommand="SELECT * FROM korisnik WHERE username = @username" 
      InsertCommand="INSERT INTO korisnik(username, userPassword, userEmail) VALUES (@username, @userPassword, @userEmail)" 
      UpdateCommand="UPDATE korisnik SET userPassword = @userPassword, userEmail = @userEmail WHERE (username = @username)"> 
    <SelectParameters> 
     <asp:Parameter Name="username" Type="String" /> 
    </SelectParameters> 
    <InsertParameters> 
     <asp:Parameter Name="username" Type="String" /> 
     <asp:Parameter Name="userPassword" Type="String" /> 
     <asp:Parameter Name="userEmail" Type="String" /> 
    </InsertParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="userPassword" Type="String" /> 
     <asp:Parameter Name="userEmail" Type="String" /> 
     <asp:Parameter Name="username" Type="String" /> 
    </UpdateParameters> 
</asp:SqlDataSource> 

謝勝利,在Page_Load中處理,這條線user = (TextBox)DV.FindControl("username");應該永遠是空的,因爲你沒有一個控制名稱「用戶名」,你只有名爲「用戶名」的DataField。

如果要在編輯模式下隱藏用戶名字段,必須將用戶名字段設置爲DetailView的Key(DataKeyNames設置)。但我建議你可以設置用戶名爲只讀而不是隱藏它(設置ReadOnly="true"BoundField)。最後,試圖讓他們在ItemUpdating事件處理程序(OnItemUpdating設置)

這裏值是樣品我的建議:

<asp:DetailsView ID="DV" runat="server" HorizontalAlign="Center" 
    Height="100px" Width="170px" 
    AutoGenerateRows="False" DataSourceID="RegisterUser" 
    OnItemCommand="Button_click" 
    OnItemInserted="Insert_click" OnItemUpdated="Edit_click" 
    OnItemUpdating="DV_ItemUpdating" 
    DataKeyNames="username"> 
    <Fields> 
     <asp:BoundField DataField="username" HeaderText="Name" 
      SortExpression="username" 
      ReadOnly="true"/> 
     <asp:TemplateField HeaderText="Password"> 
      <EditItemTemplate> 
       <asp:TextBox ID="Password" runat="server" TextMode="Password" Text='<%# Bind("userPassword") %>'></asp:TextBox> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField DataField="userEmail" HeaderText="Email" 
      SortExpression="userEmail" /> 
     <asp:CommandField ShowInsertButton="True" ShowEditButton="True" /> 
    </Fields> 
</asp:DetailsView> 

代碼behide:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     string id = Request.QueryString["id"]; 
     // EDIT mode 
     if (id == "Change_data_button") 
     { 
      DV.DefaultMode = DetailsViewMode.Edit; 
     } 
     // INSERT mode 
     else if (id == "Register_button") 
     { 
      DV.DefaultMode = DetailsViewMode.Insert; 
     } 
    } 
} 
protected void DV_ItemUpdating(object sender, DetailsViewUpdateEventArgs e) 
{ 
    string username = e.Keys["username"].ToString(); 

    TextBox txtPassword = (TextBox)DV.FindControl("Password"); 
    string password = txtPassword.Text; 

    string email = e.NewValues["userEmail"].ToString(); 

    RegisterUser.UpdateParameters["userPassword"].DefaultValue = password; 
    RegisterUser.UpdateParameters["userEmail"].DefaultValue = email; 
    RegisterUser.UpdateParameters["username"].DefaultValue = username; 

    RegisterUser.Update(); 
} 
0

你應該使用:DetailsView.ChangeMode()方法以編程方式在編輯,插入和只讀模式之間切換DetailsView控件。

if (id == "Change_data_button") 
     { 
      DV.ChangeMode(DetailsViewMode.Edit); 
      //DV.DataSource = RegisterUser; 
      //DV.DataBind(); 
     ... 
     ... 
     } 

此外,訪問綁定字段值::

string _userName = DV.Rows[0].Cells[0].Text.ToString();