6

InsertItemTemplateを介して挿入したばかりのレコードでFormViewを自動的にデフォルトで読み取り専用モードにすることは可能ですか?これは、FormViewに自然にもたらされるはずの何かのようです。

4

2 に答える 2

1

はい、可能です。

Employeeテーブルでデモンストレーションしています

次のSQLServerスクリプトを使用して、tbemployeeという名前の従業員テーブルを作成します

CREATE TABLE [dbo].[tbemployee](
[empid] [int] IDENTITY(1,1) NOT NULL,
[ename] [varchar](50) NULL,
[eadd] [varchar](50) NULL,
[esal] [int] NULL,
[edno] [int] NULL, 

CONSTRAINT [PK_tbemployee] PRIMARY KEY CLUSTERED 
(
    [empid] ASC
)
) ON [PRIMARY]
GO

FormViewにレコードを挿入するためのソースコードを以下に示します。

FormView.aspx

<asp:FormView ID="FormView1" runat="server" DataKeyNames="empid" 
        oniteminserting="FormView1_ItemInserting" DefaultMode="Insert"
        onmodechanging="FormView1_ModeChanging">            
        <InsertItemTemplate>
            ename:
            <asp:TextBox ID="txtename" runat="server" Text='<%# Bind("ename") %>' />
            <br />
            eadd:
            <asp:TextBox ID="txteadd" runat="server" Text='<%# Bind("eadd") %>' />
            <br />
            esal:
            <asp:TextBox ID="txtesal" runat="server" Text='<%# Bind("esal") %>' />
            <br />
            edno:
            <asp:TextBox ID="txtedno" runat="server" Text='<%# Bind("edno") %>' />
            <br />
            <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" 
                CommandName="Insert" Text="Insert" />
            &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server" 
                CausesValidation="False" CommandName="Cancel" Text="Cancel" />
        </InsertItemTemplate>
        <ItemTemplate>
            empid:
            <asp:Label ID="empidLabel" runat="server" Text='<%# Eval("empid") %>' />
            <br />
            ename:
            <asp:Label ID="enameLabel" runat="server" Text='<%# Bind("ename") %>' />
            <br />
            eadd:
            <asp:Label ID="eaddLabel" runat="server" Text='<%# Bind("eadd") %>' />
            <br />
            esal:
            <asp:Label ID="esalLabel" runat="server" Text='<%# Bind("esal") %>' />
            <br />
            edno:
            <asp:Label ID="ednoLabel" runat="server" Text='<%# Bind("edno") %>' />
            <br />
            <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" 
                CommandName="New" Text="New" />
        </ItemTemplate>
    </asp:FormView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="Data Source=gts7;Initial Catalog=dbemp14;Integrated Security=True;Pooling=False"             
        ProviderName="System.Data.SqlClient">           
    </asp:SqlDataSource>

そして、FormView.aspxページのコードビハインドに次のコードを貼り付けます。

FormView.aspx.cs

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

public partial class _Default : System.Web.UI.Page 
{
    SqlConnection con=new SqlConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString);

protected void Page_Load(object sender, EventArgs e)
{

}

protected void FormView1_ItemInserting(object sender, FormViewInsertEventArgs e)
    {
        string ename, eadd,insertqry;
        Int32 esal, edno;
        ename = ((TextBox)(FormView1.FindControl("txtename"))).Text;
        eadd = ((TextBox)(FormView1.FindControl("txtename"))).Text;
        esal = Convert.ToInt32(((TextBox)(FormView1.FindControl("txtesal"))).Text);
        edno = Convert.ToInt32(((TextBox)(FormView1.FindControl("txtedno"))).Text);

    insertqry="insert tbemployee(ename,eadd,esal,edno) values(@ename,@eadd,@esal,@edno)";

    if (con.State == ConnectionState.Closed)
    {
        con.Open();
    }

    SqlCommand cmd = new SqlCommand(insertqry, con);
    cmd.Parameters.Add("@ename", SqlDbType.VarChar, 50).Value = ename;
    cmd.Parameters.Add("@eadd", SqlDbType.VarChar, 50).Value = eadd;
    cmd.Parameters.Add("@esal", SqlDbType.Int).Value = esal;
    cmd.Parameters.Add("@edno", SqlDbType.Int).Value = edno;

    cmd.ExecuteNonQuery();
    cmd.Dispose();
    con.Close();

    FormView1.ChangeMode(FormViewMode.ReadOnly);
    formbind();
}

public void formbind()
{
    if (FormView1.AllowPaging == true)
    {
        SqlDataAdapter adp = new SqlDataAdapter("select * from tbemployee", con);
        DataSet ds = new DataSet();
        adp.Fill(ds);

        Int32 totrecords = ds.Tables[0].Rows.Count;
        Int32 currentpageindex = totrecords - 1;
        FormView1.PageIndex = currentpageindex;
        FormView1.DataSource = ds;
        FormView1.DataBind();
    }
    else
    {
        SqlDataAdapter adp = new SqlDataAdapter("select * from tbemployee where empid in (select isnull(max(empid),0) from tbemployee)", con);
        DataSet ds = new DataSet();
        adp.Fill(ds);
        FormView1.DataSource = ds;
        FormView1.DataBind();
    }
}

protected void FormView1_ModeChanging(object sender, FormViewModeEventArgs e)
{
    FormView1.ChangeMode(e.NewMode);
    formbind();
}
于 2011-07-16T11:20:44.877 に答える
1

私見よりはるかに簡単な別の解決策があります。

上記の(@ SK-INFOPOINT)データを使用して、FormView1.aspxをほとんど同じように記述しますが、デフォルトで「読み取り専用」モードにいくつかの小さな変更を加え、SQL挿入コマンドと選択コマンドをSQLAdapterに入れて次のようにします。これ:

FormView1.aspx

<asp:FormView ID="FormView1" runat="server" DataKeyNames="empid" 
    oniteminserting="FormView1_ItemInserting" DefaultMode="ReadOnly"
    onmodechanging="FormView1_ModeChanging">            
    <InsertItemTemplate>
        ename:
        <asp:TextBox ID="txtename" runat="server" Text='<%# Bind("ename") %>' />
        <br />
        eadd:
        <asp:TextBox ID="txteadd" runat="server" Text='<%# Bind("eadd") %>' />
        <br />
        esal:
        <asp:TextBox ID="txtesal" runat="server" Text='<%# Bind("esal") %>' />
        <br />
        edno:
        <asp:TextBox ID="txtedno" runat="server" Text='<%# Bind("edno") %>' />
        <br />
        <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" 
            CommandName="Insert" Text="Insert" />
        &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server" 
            CausesValidation="False" CommandName="Cancel" Text="Cancel" />
    </InsertItemTemplate>
    <ItemTemplate>
        empid:
        <asp:Label ID="empidLabel" runat="server" Text='<%# Eval("empid") %>' />
        <br />
        ename:
        <asp:Label ID="enameLabel" runat="server" Text='<%# Bind("ename") %>' />
        <br />
        eadd:
        <asp:Label ID="eaddLabel" runat="server" Text='<%# Bind("eadd") %>' />
        <br />
        esal:
        <asp:Label ID="esalLabel" runat="server" Text='<%# Bind("esal") %>' />
        <br />
        edno:
        <asp:Label ID="ednoLabel" runat="server" Text='<%# Bind("edno") %>' />
        <br />
        <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" 
            CommandName="New" Text="New" />
    </ItemTemplate>
</asp:FormView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="Data Source=gts7;Initial Catalog=dbemp14;Integrated Security=True;Pooling=False"             
    ProviderName="System.Data.SqlClient"
    SelectCommand="select * from tbemployee"
    InsertCommand="insert into tbemployee (ename,eadd,esal,edno) values (@ename, @eadd, @esal, @edno)">           
</asp:SqlDataSource>

これにより、ボタンとテンプレートは、挿入と選択を手動でコーディングしなくても、ほとんどの機能を実行できます。次に、FormView.aspxページのコードビハインドページに次のコードを追加します。

FormView.aspx.cs

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class _Default : System.Web.UI.Page 
{

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void FormView1_ItemInserted(object sender, FormViewInsertedEventArgs e)
    {
        DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
        FormView1.PageIndex = dv.Count - 1;
    }
}

そして、バインドされた新しいアイテムを読み取り専用モードで表示しています。また、FormViewに単純なページングテンプレートを追加すると、レコードを上下に移動できます...

:)

-シュニズル

于 2011-12-15T21:14:31.043 に答える