Pergunta

I have a little detailsview where i can add some data to my DB.

The detailsview's code:

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" 
    DataSourceID="orderSqlDataSource" DefaultMode="Insert" Height="50px" 
    Width="333px" DataKeyNames="ID" CellPadding="4" ForeColor="#333333" 
    GridLines="None" oniteminserted="DetailsView1_ItemInserted" 
                onprerender="DetailsView1_PreRender">
    <CommandRowStyle BackColor="#E2DED6" Font-Bold="True" />
    <EditRowStyle BackColor="#E9ECF1" />
    <FieldHeaderStyle BackColor="#E9ECF1" Font-Bold="True" />
    <Fields>
        <asp:BoundField DataField="userid" HeaderText="Azonosító" 
            SortExpression="userid" ReadOnly="True" />
        <asp:BoundField DataField="quantity" HeaderText="Mennyiség (kg)" 
            SortExpression="quantity" />
        <asp:TemplateField HeaderText="Mit rendel" SortExpression="Mit rendel">
            <InsertItemTemplate>
                <asp:DropDownList ID="ordertypeDropDownList" runat="server" 
                    DataSourceID="ordertypeDDLSqlDataSource" DataTextField="name" 
                    DataSource='<%# Bind("ordertype") %>'
                    SelectedValue='<%# Bind("ordertype") %>'
                    DataValueField="ID">
                </asp:DropDownList>
                <asp:SqlDataSource ID="ordertypeDDLSqlDataSource" runat="server" 
                    ConnectionString="<%$ ConnectionStrings:dotnetConnectionString %>" 
                    SelectCommand="SELECT [name], [ID] FROM [product]"></asp:SqlDataSource>
            </InsertItemTemplate>
        </asp:TemplateField>
        <asp:CommandField ShowInsertButton="True" CancelText="Mégsem" 
            InsertText="Elküld" />
    </Fields>
    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
    <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#284775" ForeColor="White" 
        HorizontalAlign="Center" />
    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
</asp:DetailsView>

Here is the code behind for the page_load event:

protected void Page_Load(object sender, EventArgs e)
    {
        if (User.Identity.IsAuthenticated)
        {
            MembershipUser user = Membership.GetUser(User.Identity.Name);
            string userID = user.ProviderUserKey.ToString();
            ((TextBox)DetailsView1.Rows[0].Cells[1].Controls[0]).Text = userID;
        }
    }

As you can see i fill the first boundfield from the page_load. The problem is that the first boundfield (userid, or in my native language "azonosító") is important because of the database, but i don't want to let the user see his/her userid. If i make the boundfield hidden (visible=false), it won't be reachable with the code in the page_load. How can i bound the current userID to that field, when the field is hidden, or how can i get this work without boundfield for the ID?

Thanks in advance!

Foi útil?

Solução

If the user doesn't need to know or interact with the value you are inserting, then it is quite easy to inject parameter values into the insert call that the DetailsView sends to your datasource control. Just use the DetailsView.Inserting event DetailsViewInsertEventArgs parameter as shown.

Code:

    protected void DetailsView1_ItemInserting(object sender, DetailsViewInsertEventArgs e)
    {
        if (User.Identity.IsAuthenticated)
        {
            MembershipUser user = Membership.GetUser(User.Identity.Name);
            string userID = user.ProviderUserKey.ToString();
            e.Values.Add("userid", userID);
        }
    }

As you might expect, this method makes the BoundField completely unnecessary :)

Outras dicas

Use Template Field and place a label and bind it with userid. You can access the label in your codebehind irrespective of it is invisible.

<asp:DetailsView   runat="server"  ID="dv" >
<Fields>
        <asp:TemplateField Visible="false" >
            <ItemTemplate>
                <asp:Label ID="lb" runat="server" Text='<%# Bind("userid") %>' />
            </ItemTemplate>
        </asp:TemplateField>
</Fields>
</asp:DetailsView> 

// In your code behind 
string userid = ((Label)dv.Rows[0].FindControl("lb")).Text(); // give the correct index
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top