C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: Gridのページを変更すると入力した値が変わってしまう


(過去ログ 107 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■63632 / inTopicNo.1)  Gridのページを変更すると入力した値が変わってしまう
  
□投稿者/ はっちゃん (1回)-(2012/09/17(Mon) 22:42:04)

分類:[ASP.NET (C#)] 

WindowsXP SP3、VisualStudio2010 PRO、C#にて開発をしております。

デフォルトでGRID上にTextBoxを表示しており、それぞれのTextBoxに値を入力して最終的にDataBaseへ書き込む処理を考えています。
PageSize=5に設定し、6行目を挿入してデータを入力して6行目が表示された状態(2ページ目をアクティブ)で確定ボタンをクリックすると
すべての値が6行目のデータと同じになってしまいます。
また、6行目を入力した状態で1ページ目をアクティブにすると、1ページ目のデータがすべて消えてしまいます。
確定ボタンのクリックやページの移動でデータの値が変わらないようにするにはどうしたらよろしいでしょうか?
どなたかご教示下さい。
よろしくお願い致します。

<DataGrid.aspx>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DataGrid.aspx.cs" Inherits="DataGrid" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
    <title id="myTitle" runat="server"></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
     
        <asp:Button ID="btnFix" runat="server" Text="確定" onclick="btnFix_Click" OnClientClick="return confirm('データを確定します。よろしいですか?');" />
        <asp:Button ID="btnRefresh" runat="server" Text="Refresh" OnClick="btnRefresh_Click" />

        <br /><br />

        <asp:Panel ID="pnlGrid" runat="server">
       
            <asp:DataGrid ID="MyGrid" runat="server">

                <Columns>
                
                    <asp:TemplateColumn HeaderText="対象(NO)" ItemStyle-Width="80" ItemStyle-HorizontalAlign="Right" SortExpression="Sorts">
                    
                        <ItemTemplate>
                    
                            <asp:CheckBox ID="chkTarget" runat="server" />
                            <asp:TextBox ID="txtSorts" runat="server" Width="50" style="text-align:right;" 
                                Text='<%# DataBinder.Eval(Container.DataItem, "Sorts") %>'></asp:TextBox>
                    
                        </ItemTemplate>

                        <FooterTemplate>
                    
                            <asp:Button ID="btnNewAddRow" CommandName="insert" runat="server" Text="空行追加" />
                            <asp:Button ID="btnDelete" CommandName="delete" runat="server" Text="削除" />
                    
                        </FooterTemplate>
                    
                    </asp:TemplateColumn>

                    <asp:TemplateColumn HeaderText="商品名" ItemStyle-Width="200" SortExpression="ProductName">
                
                        <ItemTemplate>
                    
                            <asp:TextBox ID="txtProductName" runat="server" Width="200" 
                                Text='<%# DataBinder.Eval(Container.DataItem, "ProductName") %>'></asp:TextBox>
                    
                        </ItemTemplate>
               
                    </asp:TemplateColumn>

                    <asp:TemplateColumn HeaderText="単価" ItemStyle-Width="100" ItemStyle-HorizontalAlign="Right" SortExpression="UnitPrice">
                
                        <ItemTemplate>
                    
                            <asp:TextBox ID="txtUnitPrice" runat="server" Width="100" style="text-align:right;" 
                                Text='<%# DataBinder.Eval(Container.DataItem, "UnitPrice") %>'></asp:TextBox>
                    
                        </ItemTemplate>
                
                    </asp:TemplateColumn>

                    <asp:ButtonColumn HeaderText="Del" Text="削除" CommandName="delete" ButtonType="PushButton"></asp:ButtonColumn>
            
                </Columns>
        
            </asp:DataGrid>

        </asp:Panel>

        <asp:Panel ID="pnlPage" runat="server"></asp:Panel>

    </div>
    </form>
</body>
</html>

引用返信 編集キー/
■63633 / inTopicNo.2)  Re[1]: Gridのページを変更すると入力した値が変わってしまう
□投稿者/ はっちゃん (2回)-(2012/09/17(Mon) 22:45:20)
No63632 (はっちゃん さん) に返信
csファイルです。

<DataGrid.aspx.cs>
public partial class DataGrid : System.Web.UI.Page
{
private DataTable _subDt;
private static string strConStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Visual Studio 2010\DataGrid\App_Data\DataGrid.mdf;Integrated Security=True;User Instance=True";

override protected void OnInit(EventArgs e)
{
myTitle.Text = "グリッドテスト";

CreateTable();

UpdatePanel upnl = new UpdatePanel();
upnl.UpdateMode = UpdatePanelUpdateMode.Conditional;
upnl.ContentTemplateContainer.Controls.Add(pnlGrid);
pnlPage.Controls.Add(pnlGrid);

InitializeComponent();
}

private void InitializeComponent()
{
MyGrid.ShowFooter = true;
MyGrid.AutoGenerateColumns = false;
MyGrid.CellPadding = 4;
MyGrid.CellSpacing = 0;
MyGrid.AllowSorting = true;
MyGrid.AllowPaging = true;
MyGrid.PageSize = 5;
MyGrid.PagerStyle.Mode = System.Web.UI.WebControls.PagerMode.NumericPages;
MyGrid.PagerStyle.Position = System.Web.UI.WebControls.PagerPosition.Top;

MyGrid.PageIndexChanged += new DataGridPageChangedEventHandler(MyGrid_PageIndexChanged);
MyGrid.ItemCreated += new DataGridItemEventHandler(MyGrid_ItemCreated);
MyGrid.ItemDataBound += new DataGridItemEventHandler(MyGrid_ItemDataBound);
MyGrid.ItemCommand += new DataGridCommandEventHandler(MyGrid_ItemCommand);
MyGrid.SortCommand += new DataGridSortCommandEventHandler(MyGrid_SortCommand);
MyGrid.DeleteCommand += new DataGridCommandEventHandler(MyGrid_DeleteCommand);
}

private void CreateTable()
{
SqlConnection conn = null;
SqlDataAdapter adp = null;
DataSet ds = null;

string strSQL = "select * from T_T_M商品";

try
{
using (conn = new SqlConnection(strConStr))
{
conn.Open();

using (adp = new SqlDataAdapter(strSQL, conn))
{
ds = new DataSet();
adp.Fill(ds, "Table");
}

conn.Close();
}

_subDt = ds.Tables["Table"];
}
catch (Exception ex)
{
MsgBox(Page, "エラーが発生しました:" + ex.Message);
}
finally
{
if (ds != null)
{
ds.Dispose();
}
if (adp != null)
{
adp.Dispose();
}
if (conn != null)
{
conn.Dispose();
}
}
}

private void Insert()
{
int Index = 0;
string strSorts = "0";
DataRow dr = _subDt.NewRow();

if (_subDt.Rows.Count > 0)
{
foreach (DataRow drT in _subDt.Rows)
{
if (drT.RowState != DataRowState.Deleted)
{
strSorts = drT["Sorts"].ToString();

if (drT.RowState != DataRowState.Unchanged)
{
TextBox txt = (TextBox)MyGrid.Items[Index].FindControl("txtProductName");
if (txt.Text != "")
{
drT["ProductName"] = txt.Text;
}

txt = (TextBox)MyGrid.Items[Index].FindControl("txtUnitPrice");
if (txt.Text != "")
{
drT["UnitPrice"] = decimal.Parse(txt.Text);
}
}
}

Index++;
}
}

if (strSorts.Contains("."))
{
dr["Sorts"] = int.Parse(strSorts.Substring(0, strSorts.IndexOf("."))) + 1;
}
else
{
dr["Sorts"] = int.Parse(strSorts) + 1;
}

_subDt.Rows.Add(dr);
}

private void Delete(decimal Sorts)
{
DataRow dr = _subDt.Select("Sorts = " + Sorts)[0];
dr.Delete();
}

private void BindMyGrid(object obj)
{
if (obj is DataTable)
{
MyGrid.DataSource = (DataTable)obj;
}
else if (obj is DataView)
{
MyGrid.DataSource = (DataView)obj;
}

MyGrid.DataBind();
}

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session["userTable"] = _subDt;
Session["IsErrProductName"] = false;
Session["IsErrUnitPrice"] = false;
Session["IsNewRow"] = false;
Session["IsErrItemIndex"] = 0;

BindMyGrid(_subDt);
}
else
{
_subDt = (DataTable)Session["userTable"];
}
}

protected void MyGrid_DeleteCommand(object sender, DataGridCommandEventArgs e)
{
decimal Key;

DataGridItem dataItem = e.Item;
ListItemType lit = dataItem.ItemType;

if (lit == ListItemType.AlternatingItem || lit == ListItemType.Item)
{
string strKey = ((TextBox)dataItem.FindControl("txtSorts")).Text;

Key = decimal.Parse(strKey);

Delete(Key);
}
else if (lit == ListItemType.Footer)
{
bool IsChecked = false;

foreach (DataGridItem dgi in MyGrid.Items)
{
CheckBox chkTarget = (CheckBox)dgi.FindControl("chkTarget");

if (chkTarget.Checked)
{
IsChecked = true;
string strKey = ((TextBox)dgi.FindControl("txtSorts")).Text;

if (strKey.Contains("."))
{
Key = int.Parse(strKey.Substring(0, strKey.IndexOf(".")));
}
else
{
Key = int.Parse(strKey);
}

Delete(Key);
}
}

if (!IsChecked)
{
MsgBox(Page, "削除する行を選択して下さい。");
BindMyGrid(_subDt);
return;
}
}

if (MyGrid.CurrentPageIndex == MyGrid.PageCount - 1 && MyGrid.CurrentPageIndex > 0)
{
MyGrid.CurrentPageIndex = MyGrid.CurrentPageIndex - 1;
}

BindMyGrid(_subDt);
}

protected void btnRefresh_Click(object sender, EventArgs e)
{
CreateTable();
Session["userTable"] = _subDt;
BindMyGrid(_subDt);
}
引用返信 編集キー/
■63634 / inTopicNo.3)  Re[2]: Gridのページを変更すると入力した値が変わってしまう
□投稿者/ はっちゃん (3回)-(2012/09/17(Mon) 22:47:35)
No63633 (はっちゃん さん) に返信
> ■No63632 (はっちゃん さん) に返信
csファイル続きです。

<DataGrid.aspx.cs>

    protected void btnFix_Click(object sender, EventArgs e)
    {
        bool IsFix = false;
        SqlConnection conn = null;
        SqlDataAdapter adp = null;
        SqlCommandBuilder cb = null;

        foreach (DataRow dr in _subDt.Rows)
        {
            if (dr.RowState != DataRowState.Deleted)
            {
                int index = 0;
                foreach (DataGridItem dgi in MyGrid.Items)
                {
                    if (((TextBox)dgi.FindControl("txtSorts")).Text == dr["Sorts"].ToString())
                    {
                        index = dgi.ItemIndex;
                        break;
                    }
                }

                TextBox txtProductName = (TextBox)MyGrid.Items[index].FindControl("txtProductName");
                TextBox txtUnitPrice = (TextBox)MyGrid.Items[index].FindControl("txtUnitPrice");

                if (txtProductName != null && dr["ProductName"].ToString() != txtProductName.Text)
                {
                    dr["ProductName"] = txtProductName.Text;
                }

                if (txtUnitPrice != null && dr["UnitPrice"].ToString() != txtUnitPrice.Text)
                {
                    if (txtUnitPrice.Text != "")
                    {
                        dr["UnitPrice"] = decimal.Parse(txtUnitPrice.Text);
                    }
                    else
                    {
                        dr["UnitPrice"] = DBNull.Value;
                    }
                }

                if (txtProductName.Text == "" && txtUnitPrice.Text != "")
                {
                    MsgBox(Page, "商品名が入力されていません。");
                    Session["IsErrProductName"] = true;
                    Session["IsErrItemIndex"] = index;
                    BindMyGrid(_subDt);
                    return;
                }
                else if (txtProductName.Text != "" && txtUnitPrice.Text == "")
                {
                    MsgBox(Page, "単価が入力されていません。");
                    Session["IsErrUnitPrice"] = true;
                    Session["IsErrItemIndex"] = index;
                    BindMyGrid(_subDt);
                    return;
                }
            }
        }

        DataTable dt = _subDt.GetChanges();
        
        if (dt != null && dt.Rows.Count > 0)
        {
            for (int i = dt.Rows.Count; i > 0; i--)
            {
                if (dt.Rows[i - 1].RowState != DataRowState.Deleted)
                {
                    if (dt.Rows[i - 1]["ProductName"].ToString() == "" && dt.Rows[i - 1]["UnitPrice"].ToString() == "")
                    {
                        dt.Rows[i - 1].Delete();
                    }
                }
            }

            if (dt.Rows.Count == 0)
            {
                dt = null;
            }
        }

        string strSQL = "select * from T_T_M商品";

        try
        {
            using (conn = new SqlConnection(strConStr))
            {
                using (adp = new SqlDataAdapter(strSQL, conn))
                {
                    using (cb = new SqlCommandBuilder(adp))
                    {
                        if (dt != null)
                        {
                            adp.Update(dt);
                            IsFix = true;
                        }
                    }
                }
            }

            btnRefresh_Click(sender, e);

            if (IsFix)
            {
                MsgBox(Page, "正常終了!!");
            }
            else
            {
                MsgBox(Page, "データの変更はありません。");
            }
        }
        catch (Exception ex)
        {
            MsgBox(Page, "エラーが発生しました:" + ex.Message);
        }
        finally
        {
            if (dt != null)
            {
                dt.Dispose();
            }
            if (cb != null)
            {
                cb.Dispose();
            }
            if (adp != null)
            {
                adp.Dispose();
            }
            if (conn != null)
            {
                conn.Dispose();
            }
        }
    }

    protected void MyGrid_PageIndexChanged(object sender, DataGridPageChangedEventArgs e)
    {
        MyGrid.CurrentPageIndex = e.NewPageIndex;
        BindMyGrid(_subDt);
    }

    protected void MyGrid_ItemCreated(object sender, DataGridItemEventArgs e)
    {
        DataGridItem dataItem = e.Item;
        ListItemType lit = dataItem.ItemType;
        
        switch (lit)
        {
            case ListItemType.Header:

                dataItem.HorizontalAlign = HorizontalAlign.Center;
                dataItem.ForeColor = Color.White;
                dataItem.BackColor = Color.DarkSlateGray;
                dataItem.Font.Bold = true;

                break;

            case ListItemType.Pager:

                dataItem.BackColor = Color.LightGray;

                break;

            case ListItemType.Item:

                dataItem.BackColor = Color.White;

                break;

            case ListItemType.AlternatingItem:

                dataItem.BackColor = Color.LightCyan;

                break;

            case ListItemType.EditItem:

                dataItem.BackColor = Color.Magenta;

                break;

            case ListItemType.SelectedItem:

                dataItem.BackColor = Color.Yellow;

                break;

            case ListItemType.Footer:

                dataItem.BackColor = Color.DarkSlateGray;

                int iC = dataItem.Cells.Count;
                while (dataItem.Cells.Count > 1)
                {
                    dataItem.Cells.RemoveAt(1);
                }
                dataItem.Cells[0].ColumnSpan = iC;

                break;
        }
    }

    protected void MyGrid_ItemCommand(object sender, DataGridCommandEventArgs e)
    {
        if (e.CommandName == "insert")
        {
            Insert();
            Session["IsNewRow"] = true;
            BindMyGrid(_subDt);
        }
    }

    private bool IsNumeric(string strText)
    {
        decimal dTmp;
        return decimal.TryParse(strText, out dTmp);
    }

    protected void MyGrid_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
        Button btnDelete;
        DataGridItem dataItem = e.Item;
        ListItemType lit = dataItem.ItemType;

        if (lit == ListItemType.Item || lit == ListItemType.AlternatingItem)
        {
            btnDelete = (Button)dataItem.Cells[3].Controls[0];
            btnDelete.Attributes["onClick"] = "return confirm('この行を削除します。よろしいですか?');";
            btnDelete.ForeColor = Color.Blue;

            TextBox txtProductName = (TextBox)dataItem.FindControl("txtProductName");

            if ((bool)Session["IsNewRow"] && !(bool)Session["IsErrProductName"] && !(bool)Session["IsErrUnitPrice"])
            {
                ScriptManager1.SetFocus(txtProductName);
            }

            if ((int)Session["IsErrItemIndex"] == dataItem.ItemIndex)
            {
                if ((bool)Session["IsErrProductName"] && txtProductName.Text == "")
                {
                    txtProductName.BackColor = Color.Yellow;
                    ScriptManager1.SetFocus(txtProductName);
                }

                TextBox txtUnitPrice = (TextBox)dataItem.FindControl("txtUnitPrice");
                if ((bool)Session["IsErrUnitPrice"] && txtUnitPrice.Text == "")
                {
                    txtUnitPrice.BackColor = Color.Yellow;
                    ScriptManager1.SetFocus(txtUnitPrice);
                }
            }
        }
        else if (lit == ListItemType.Footer)
        {
            Button btnNewAddRow = new Button();
            btnNewAddRow = (Button)dataItem.FindControl("btnNewAddRow");
            btnNewAddRow.ForeColor = Color.Red;

            btnDelete = (Button)dataItem.FindControl("btnDelete");
            btnDelete.Attributes["onClick"] = "return confirm('この行を削除します。よろしいですか?');";
            if (MyGrid.Items.Count <= 0)
            {
                btnDelete.Enabled = false;
            }
            else
            {
                btnDelete.Enabled = true;
            }
        }
    }

引用返信 編集キー/
■63635 / inTopicNo.4)  Re[3]: Gridのページを変更すると入力した値が変わってしまう
□投稿者/ はっちゃん (4回)-(2012/09/17(Mon) 22:49:50)
No63634 (はっちゃん さん) に返信
> ■No63633 (はっちゃん さん) に返信
>>■No63632 (はっちゃん さん) に返信
csファイル続きです。

<DataGrid.aspx.cs>

private void MsgBox(Page myPage, string strMsg)
{
string strScript = "alert('" + strMsg + "');";
myPage.ClientScript.RegisterStartupScript(myPage.GetType(), "Message", strScript, true);
}
}
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -