0

ボタンをクリックするだけで2つのTextBoxから抽出されたデータを含むGridViewがあります。次の機能をGridviewに実装したい:1)このGridViewのデータを編集できるようにしたい。2)GridViewから行を削除することもできるはずです。3)最後に、別の[送信]ボタンをクリックすると、Gridviewのすべての行がデータベースに保存されます。

C#(Visual Studio 2010)を使用してコーディングされたWebベースのASP.NETアプリケーションであり、SQL Server 2005を使用します。以下のコードを変更して、上記の指定された機能を実装するにはどうすればよいですか?

public partial class _Default : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["constring"]);
    SqlCommand cmd = new SqlCommand();
    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter();
    DataTable dt = new DataTable();

    protected void Page_Load(object sender, EventArgs e)
    {      
        if (IsPostBack)
        {
            dt = Session["data_table"] as DataTable;
        }
    }

    protected void btnTextDisplay_Click(object sender, EventArgs e)
    {      
        if (dt == null)
        {
            dt = new DataTable();
            DataColumn dc1 = new DataColumn("Name");
            DataColumn dc2 = new DataColumn("City");
            dt.Columns.Add(dc1);
            dt.Columns.Add(dc2);

            Session["data_table"] = dt;
        }

        DataRow dr = dt.NewRow();
        dr[0] = txtName.Text;
        dr[1] = txtCity.Text;
        dt.Rows.Add(dr);
        gvDisplay.DataSource = dt;
        gvDisplay.DataBind();
    }

    protected void btnDisplay_Click(object sender, EventArgs e)
    {
        ds.Clear();
        da = new SqlDataAdapter("insert into PRACT values(@name, @city)", con);
        con.Open();
        da.Fill(ds);
        gv.DataSource = ds;
        gv.DataBind();
        con.Close();        
    }   
}
4

1 に答える 1

0

あなたのaspxページでは、それを行うことをお勧めします:

<asp:GridView runat="server" id="gvDisplay" OnRowCommand="grid_OnRowCommand">
  <Columns>
  <TemplateField>
    <ItemTemplate>
      <asp:TextBox runat="server" id="txtNameGrid" Text='<%#DataBinder.Eval(Container.DataItem, "Name")%>'/>
    </ItemTemplate>
  </TemplateField>
  <TemplateField>
    <ItemTemplate>
      <asp:TextBox runat="server" id="txtCityGrid" Text='<%#DataBinder.Eval(Container.DataItem, "City")%>'/>
    </ItemTemplate>
  </TemplateField>
  <TemplateField>
    <ItemTemplate>
      <asp:Button runat="server" id="btnDeleteGrid" Text = "Delete" CommandArgument='<%#Eval(Container.DataItem, "YourIDColumn")%>' CommandName="DeleteRow"/>
    </ItemTemplate>
  </TemplateField>
</Columns>
</asp:GridView>

DataTable に新しい列を作成することをお勧めします。この列は各レジスタの ID になります。

ページのこの DataTable にレジスタを追加するため、int 型のセッションを作成する必要があり、イベント btnTextDisplay_Click が呼び出されるたびに、この int セッションを増やして、その値を DataTable の列 ID に設定する必要があります。

グリッドの属性 OnRowCommand は、ボタン btnDeleteGrid をクリックしたときに呼び出されるイベントです。このイベントのコードは次のとおりです。

protected void grid_OnRowCommand(object sender, GridViewCommandEventArgs e)
{
   if(e.CommandName == "DeleteRow")
   {
      foreach(DataRow row in dt.Rows)
      {
         if(Convert.ToInt32(row["YourColumnID"]) == Convert.ToInt32(e.CommandArgument))
            row.Delete();
      }

      dt.AcceptChanges();

      gvDisplay.DataSource = dt;
      gvDisplay.DataBind();
   }
}

レジスタを保存するイベントはそのようにする必要があります。

protected void btnSave_Click(object sender, EventArgs e)
{
   foreach(DataRow row in dt.Rows)
   {
     SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["constring"]);
     SqlCommand cmd = new SqlCommand();

     cmd.CommandText = "INSERT INTO YOUR_TABLE_NAME (NAME, CITY) VALUES (" + row["Name"].ToString() + "," + row["City"].ToString() + ")";

     int numRegs = cmd.ExecuteNonQuery();
   }
}

私は本当に私が助けたと思っています。私は自分のコードをテストできず、DataTable の操作も苦手なので、コードに問題がある場合はお知らせください。

Bulk Inserts を使用して挿入を実現すると、より効率的になると思います。作り方を検索すると、かなりクールで手っ取り早いです。

また、直接コマンド テキストを使用するよりも安全であるため、ストアド プロシージャも使用してみてください。それらを使用すると、SQL インジェクションを防ぐことができます。

よろしくお願いします。

于 2013-02-19T13:39:35.327 に答える