2013-12-08 37 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();