【问题标题】:changing DetailsViewMode on Page_Load event在 Page_Load 事件上更改 DetailsViewMode
【发布时间】:2013-12-08 18:52:19
【问题描述】:

我有一个简单的 DetailsView 控件连接到由两个 T-SQL 查询组成的数据源(工作正常)。但是,当我尝试在 Page_Load 事件上将模式(取决于 URL 中的 id)更改为“编辑”时,没有任何显示,而“插入”工作正常。一切似乎都是正确的数据绑定。

另外,我如何从代码隐藏中访问 BoundField 值(文本本身)(FindControl 由于某种原因总是返回 null)?我想在页面加载时有一个默认值。

标记:

<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;
        }
    }
}

【问题讨论】:

    标签: c# asp.net detailsview boundfield


    【解决方案1】:

    首先,我在名为RegisterUserSqlDataSource 控件中没有看到SelectCommand 的任何设置,我认为您不会在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 的键(DataKeyNames 设置)。但我建议您可以将用户名设置为只读而不是隐藏它(在 BoundField 中设置ReadOnly="true")。最后,尝试在 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>
    

    代码隐藏:

    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();
    }
    

    【讨论】:

      【解决方案2】:

      您应该使用: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();
      

      【讨论】:

        猜你喜欢
        • 2011-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多