0

私は C#-4.0 で Asp.Net に取り組んでいます。GridView でエンド ユーザーから入力を取得したい。お気に入り

ここに画像の説明を入力

DropDownList または TextBox に値を入力して [追加] をクリックすると、新しいレコードが追加されますが、以前のデータは失われます。

ここに画像の説明を入力

問題は、コントロールの値を変更すると、バインドされている DataTable に保存されないことです。この値を DataTable に保存するにはどうすればよいですか。ここで見逃したコードは何ですか?

デザイナーコード:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="SaleOrder.aspx.cs" Inherits="Transactions_SaleOrder" %>

<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="asp" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" Runat="Server">
    <style type="text/css">
        .style1
        {
            width: 100%;
        }
        </style>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="FormHeader" Runat="Server">
    <p>Sale Order</p>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="FormBody" Runat="Server">
    <table class="style1">
        <tr>
            <td>
                <asp:Label ID="lblDate" runat="server" Text="Date : "></asp:Label>
<asp:TextBox ID="txtSODate" runat="server"></asp:TextBox>
                <asp:CalendarExtender ID="txtSODate_CalendarExtender" runat="server" 
                    Enabled="True" TargetControlID="txtSODate" Format="dd/MM/yyyy" PopupButtonID="ImageButton1">
                </asp:CalendarExtender>
                <asp:MaskedEditExtender ID="txtSODate_MaskedEditExtender" runat="server" 
                Enabled="True" Mask="99/99/9999" MaskType="Date" TargetControlID="txtSODate">
                </asp:MaskedEditExtender>
                <asp:ImageButton ID="ImageButton1" runat="server" 
                    ImageUrl="~/images/Calendar_scheduleHS.png" />
            </td>
        </tr>
        <tr>
            <td>
                Shift : 
                <asp:DropDownList ID="DropDownList1" runat="server" Width="300px">
                    <asp:ListItem Value="Morning">MORNING</asp:ListItem>
                    <asp:ListItem Value="EVENING"></asp:ListItem>
                    <asp:ListItem Value="OTHERS"></asp:ListItem>
                </asp:DropDownList>
            </td>
        </tr>
        <tr>
            <td>
                <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                    CellPadding="4" ForeColor="#333333" GridLines="None" 
                    onrowcommand="GridView1_RowCommand">
                    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                    <Columns>
                        <asp:TemplateField HeaderText="Product">
                            <ItemTemplate>
                                <asp:DropDownList ID="ddlProduct" runat="server" Width="300"
                                DataSource='<%# dtProductMaster %>'
                                DataTextField="PDescr"
                                DataValueField="PID"
                                >
                                </asp:DropDownList>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="Qty">
                            <ItemTemplate>
                                <asp:TextBox ID="txtQuan" runat="server" MaxLength="5" style="text-align:right" Text='<%# BIND("QUAN") %>'></asp:TextBox>
                                <asp:MaskedEditExtender ID="txtQuan_MaskedEditExtender" runat="server" Enabled="True" 
                                    Mask="99999" TargetControlID="txtQuan">
                                </asp:MaskedEditExtender>
                            </ItemTemplate>
                            <ItemStyle HorizontalAlign="Right" />
                        </asp:TemplateField>
                        <asp:ButtonField CommandName="ADD" Text="Add" />
                        <asp:ButtonField CommandName="DELETE" Text="Delete" />
                    </Columns>
                    <EditRowStyle BackColor="#999999" />
                    <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" />
                    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                    <SortedAscendingCellStyle BackColor="#E9E7E2" />
                    <SortedAscendingHeaderStyle BackColor="#506C8C" />
                    <SortedDescendingCellStyle BackColor="#FFFDF8" />
                    <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
                </asp:GridView>
            </td>
        </tr>
        <tr>
            <td>
                <asp:Button ID="btnSave" runat="server" Text="Save" Width="58px" />
            </td>
        </tr>
    </table>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="FormFooter" Runat="Server">
</asp:Content>

その背後にあるC#コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
public partial class Transactions_SaleOrder : System.Web.UI.Page
{
    internal DataTable dtProductMaster_;
    internal DataTable dtProductMaster
    {
        get
        {
            if (dtProductMaster_ == null)
            {
                clsData d = new clsData();
                d.Select("select PID, PEDESCR2 + ' ' + PEDESCR3 as PDescr From TBLPROD_MAST");
                dtProductMaster_ = d.DataTable;
            }
            return dtProductMaster_;
        }
    }
    DataTable dtProductDet
    {
        get
        {
            if (ViewState["dtProductDet"] != null)
            {
                return (DataTable)ViewState["dtProductDet"];
            }
            else
            {
                return null;
            }
        }
        set
        {
            ViewState["dtProductDet"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            txtSODate.Text = DateTime.Now.Date.ToString("dd/MM/yyyy");
            //--
            dtProductDet = new DataTable("dtProductDet");
            dtProductDet.Columns.Add("PID", typeof(int));
            dtProductDet.Columns.Add("PName", typeof(string));
            dtProductDet.Columns.Add("Quan", typeof(decimal));
            dtProductDet.Rows.Add(0,"",0);
            //--
        }
        GridView1.DataSource = dtProductDet;
        GridView1.DataBind();
    }
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        switch (e.CommandName.ToUpper())
        {
            case "ADD":
                dtProductDet.Rows.Add(0, "", 0);
                break;
            case "DELETE":
                dtProductDet.Rows.RemoveAt(Convert.ToInt32(e.CommandArgument));
                break;
        }
    }
}

どうすれば私の目標を達成できますか。

4

2 に答える 2

0

答えは以前のコメントですでに与えられています。それを綴ると…

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        txtSODate.Text = DateTime.Now.Date.ToString("dd/MM/yyyy");
        //--
        dtProductDet = new DataTable("dtProductDet");
        dtProductDet.Columns.Add("PID", typeof(int));
        dtProductDet.Columns.Add("PName", typeof(string));
        dtProductDet.Columns.Add("Quan", typeof(decimal));
        dtProductDet.Rows.Add(0,"",0);
        //--
        GridView1.DataSource = dtProductDet;
        GridView1.DataBind();
    }
}

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    switch (e.CommandName.ToUpper())
    {
        case "ADD":
            dtProductDet.Rows.Add(0, "", 0);
            break;
        case "DELETE":
            dtProductDet.Rows.RemoveAt(Convert.ToInt32(e.CommandArgument));
            break;
    }
    GridView1.DataBind();
}
于 2013-04-08T14:06:10.483 に答える
0

私は解決策を持っています。

問題は、DropDownList または TextBox で値を編集しているときに、その値が GridView と TextBox および DropDownList にバインドされている DataTable に保存されないことです。これを自動的に行う方法はないため、手動でコードを記述して値を DataTable に保存する必要があります。

質問をしたとき、追加ボタンは GridViewColumn にあり、それはコマンド列でしたが、GridView フッターにボタンを追加しました。

したがって、「新しい行を追加」ボタンをクリックすると、ページがポストバックされ、最初にページ読み込みイベントが発生し、次に Button_Click イベントが発生します。Page.Load イベントにコードを追加しました。ページがポストバックされた場合は、GridView からデータを選択して DataTable に保存します。

次に、Button_click イベントが発生するため、新しい行が DataTable に追加され、DataTable が GridView の DataSource に割り当てられ、DataBind メソッドが実行され、GridView が再生成されます。

GridView 以外の別の DataTable にもバインドされる DropDownList があるため、DataBind() の後で、GridView の DataTable に保存されているように、DropDownList の値を手動で選択する必要があります。

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        txtSODate.Text = DateTime.Now.Date.ToString("dd/MM/yyyy");
        //--
        dtProductDet = new DataTable("dtProductDet");
        dtProductDet.Columns.Add("PID", typeof(int));
        dtProductDet.Columns.Add("PName", typeof(string));
        dtProductDet.Columns.Add("Quan", typeof(decimal));
        dtProductDet.Rows.Add(0,"",0);
        //--
        SetGridViewSource();
    }
    else
    {
        DataTable dtPD = dtProductDet;
        DropDownList ddlProd = null;
        if (GridView1.Rows.Count > 0)
        {
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
                ddlProd = (DropDownList)GridView1.Rows[i].Cells[gvci_Prod].FindControl("ddlProduct");
                dtPD.Rows[i]["PID"] = Convert.ToInt32(ddlProd.SelectedItem.Value);
                dtPD.Rows[i]["PName"] = ddlProd.SelectedItem.Text;
                dtPD.Rows[i]["QUAN"] = ((TextBox)GridView1.Rows[i].Cells[gvci_Quan].FindControl("txtQuan")).Text;
            }
        }
        dtProductDet = dtPD;
    }
}


protected void btnAdd_Click(object sender, EventArgs e)
{
    dtProductDet.Rows.Add(0, "", 0);

    DataTable dtPDet = dtProductDet;
    GridView1.DataSource = dtPDet;
    GridView1.DataBind();


    DropDownList ddlProd = null;
    DataRow drFind = null;
    for (int i = 0; i < GridView1.Rows.Count; i++)
    {
        ddlProd = (DropDownList)GridView1.Rows[i].Cells[gvci_Prod].FindControl("ddlProduct");
        drFind = dtProductMaster.Rows.Find(dtPDet.Rows[i]["PID"]);
        if(drFind != null)
        {
            ddlProd.SelectedIndex = dtProductMaster.Rows.IndexOf(drFind);
        }
    }

}
于 2013-04-09T13:20:17.253 に答える