.net GridView 추가,삭제,저장

.net에서 GridView를 많이 사용하는데요.
GridView를 사용함에 있어 화면의 깜빡임 없이 행을 추가한다거나 삭제를 한다거나 저장을 하고 싶을 때는 어떻게 하면 좋은까요?


하여 오늘은 .net GridView 추가,삭제,저장에 대해서 알아보도록 하겠습니다.




먼저 .aspx의 소스 입니다.

<asp:UpdatePanel ID="MaterialUpdatePanel" runat="server">
            <ContentTemplate>
                <asp:GridView ID="gvListMaterial" runat="server" AutoGenerateColumns="False" DataKeyNames="MATERIALID"
                    ShowHeaderWhenEmpty="True" Style="margin-top: 0px" Width="100%" CellPadding="0"
                    CssClass="table_content btn_margin" PageSize="12" ForeColor="#333333" GridLines="both"
                    HorizontalAlign="Center" OnRowDataBound = "RowDataBound_Material" ShowFooter="true">
                    <AlternatingRowStyle BackColor="White" />
                    <Columns>
                        <asp:TemplateField HeaderText="자재명" HeaderStyle-CssClass="cell_left" HeaderStyle-Width="23%" ItemStyle-Width="23%">
                            <ItemTemplate>
                                <input type="text" id="INPUTRESOURCENAME" name="INPUTRESOURCENAME" value='<%# Eval("INPUTRESOURCENAME") %>' class="search_text textname" ReadOnly="true" maxlength="100" style="width:69%;" />
                                <input type="hidden" id="INPUTRESOURCEID" name="INPUTRESOURCEID" value='<%# Eval("INPUTRESOURCEID") %>' />
                                <img src="/images/btn_popsrc.gif" class="popsrc_align" id="INPUTRESOURCE_SEARCHBTN" alt="" onclick="fnSearchPopup(this, 1, 'gvListMaterial');"/>
                                <img src="/images/btn/eraser.png" class="popsrc_align" id="CLIENTDELBTN" alt="" onclick="fnSearchPopup(this, 2, 'gvListMaterial');"/>
                     
                                <input type="hidden" id="MATERIALID" name="MATERIALID" value='<%# Eval("MATERIALID") %>' />
                                <input type="hidden" id="STATUS_GUBUN" name="STATUS_GUBUN" value='' />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="규격" HeaderStyle-CssClass="cell_left" HeaderStyle-Width="14%" ItemStyle-Width="14%">
                            <ItemTemplate>
                                <input type="text" id="SPECIFICATION" name="SPECIFICATION" value='<%# Eval("SPECIFICATION") %>' class="search_text textname" style="width:94%;" />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="단위" HeaderStyle-CssClass="cell_left" HeaderStyle-Width="14%" ItemStyle-Width="14%">
                            <ItemTemplate>
                                <input type="text" id="UNIT" name="UNIT" value='<%# Eval("UNIT") %>' class="search_text textname" style="width:94%;" />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="단가" HeaderStyle-CssClass="cell_left" HeaderStyle-Width="14%" ItemStyle-Width="14%">
                            <ItemTemplate>
                                <input type="text" id="UNITPRICE" name="UNITPRICE" value='<%# Eval("UNITPRICE") %>' class="input_text textname" style="width:94%;" onkeyup="fnInputNumberOnly(this,'c');" onblur="fnAutoTotal(this, 'gvListMaterial'); fnChange(this);" />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="수량" HeaderStyle-CssClass="cell_left" HeaderStyle-Width="14%" ItemStyle-Width="14%">
                            <ItemTemplate>
                                <input type="text" id="VOLUME" name="VOLUME" value='<%# Eval("VOLUME") %>' class="input_text textname" style="width:94%;" onkeyup="fnInputNumberOnly(this,'c');" onblur="fnAutoTotal(this, 'gvListMaterial'); fnChange(this);" />
                            </ItemTemplate>
                            <FooterTemplate>
                                <asp:Label ID="lblTotalVOLUME" runat="server"></asp:Label>
                            </FooterTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="금액" HeaderStyle-CssClass="cell_left" HeaderStyle-Width="14%" ItemStyle-Width="14%">
                            <ItemTemplate>
                                <input type="text" id="PRICE" name="PRICE" value='<%# Eval("PRICE") %>' class="search_text textname" style="width:94%;" onchange="fnInputNumberOnly(this,'c');" />
                            </ItemTemplate>
                            <FooterTemplate>
                                <asp:Label ID="lblTotalPRICE" runat="server"></asp:Label>
                            </FooterTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="" HeaderStyle-CssClass="cell_center" ItemStyle-HorizontalAlign="Center" FooterStyle-HorizontalAlign="Center" FooterStyle-VerticalAlign="Middle" HeaderStyle-Width="7%" ItemStyle-Width="7%">
                            <ItemTemplate>
                                <button ID="btnDelete" class="small_btn2" onclick="fnAddDelete(this, 'gvListMaterial');return false;">삭제</button>
                            </ItemTemplate>
                            <FooterTemplate>
                                <button ID="btnAdd" class="small_btn" onclick="fnAddRow(this, 'gvListMaterial');return false;">추가</button>
                            </FooterTemplate>
                        </asp:TemplateField>
                    </Columns>
                    <EditRowStyle BackColor="#ffffff" />
                    <EmptyDataRowStyle CssClass="data_AC row25" />
                    <EmptyDataTemplate>
                        데이터가 존재하지 않습니다.
                    </EmptyDataTemplate>
                    <FooterStyle BackColor="#507CD1" ForeColor="White" Font-Bold="True" />
                    <HeaderStyle BackColor="#eaecf3" Font-Bold="True" ForeColor="#374994" />
                    <PagerStyle HorizontalAlign="Center" />
                    <RowStyle BackColor="#ffffff" CssClass="data_AC" />
                    <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                    <SortedAscendingCellStyle BackColor="#F5F7FB" />
                    <SortedAscendingHeaderStyle BackColor="#6D95E1" />
                    <SortedDescendingCellStyle BackColor="#E9EBEF" />
                    <SortedDescendingHeaderStyle BackColor="#4870BE" />
                </asp:GridView>
            </ContentTemplate>
        </asp:UpdatePanel>

해당 GridView를 UpdatePanel로 감싸야 하는게 핵심 입니다.

<asp:Button ID="btnSave2" runat="server" Text="저장" CssClass="blueBtn1" OnClick="btnSave_Click" CommandName="Create" OnClientClick="return fnSave();" />
저장 버튼 이구요.

그리고 javascript쪽을 보시겠습니다.




<script type="text/javascript">
        $(window).load(function () {
        });


        // 저장
        function fnSave() {
            //////////////////////////////////////////////////////////////////////////////
            // 자재 투입 계획
            //////////////////////////////////////////////////////////////////////////////
            var myObject_Material = new Array();
            var list_Material = $('#<%=gvListMaterial.ClientID %>').find("tr");

            for (var i = 0; i < list_Material.length; i++) {
                var statusGubun = $(list_Material[i]).find("#STATUS_GUBUN").val();
                var inputResourceID = $(list_Material[i]).find("#INPUTRESOURCEID").val();

                if(statusGubun != "" && statusGubun != undefined && inputResourceID != "" && inputResourceID != undefined){
                    var arr2 = new Object();

                    $(list_Material[i]).find("input").each(function () {
                        var id = $(this).attr("id");

                        if (id != null && id != "") {
                            arr2[id] = $(this).val();
                        }
                    });

                    myObject_Material.push(arr2);
                }
            }

            var data_Material = JSON.stringify(myObject_Material);

            $("#<%= this.hdnMATERIALResultData.ClientID%>").val(data_Material);
        }


        //////////////////////////////////////////////////////////////////////////////
        // 그리드 관련 팝업
        //////////////////////////////////////////////////////////////////////////////
        var retuenInputResourceName;
        var retuenInputResourceID;
        var retuenSpecification;
        var retuenUnit;
        var retuenWorkerName;
        var retuenWorkerID;
        var retuenResident;
        function fnSearchPopup(object, type, strGrid_Gubun) {
            var gubun = "";
            if (strGrid_Gubun == "gvListMaterial")
                gubun = 10;
            else if (strGrid_Gubun == "gvListEquipment")
                gubun = 20;
            else if (strGrid_Gubun == "gvListIndirectExpense")
                gubun = 30;
            else if (strGrid_Gubun == "gvListOutsideOrderExpense")
                gubun = 40;


            var tr = object.parentNode.parentNode;

         
retuenInputResourceName = $(tr).find("#INPUTRESOURCENAME");
retuenInputResourceID = $(tr).find("#INPUTRESOURCEID");
retuenSpecification = $(tr).find("#SPECIFICATION");
retuenUnit = $(tr).find("#UNIT");
var statusGubun = $(tr).find("#STATUS_GUBUN").val();

if (statusGubun != "I")
$(tr).find("#STATUS_GUBUN").val("U");

if (type == "1") {
var returnValue = fnOpenPopup('popInputResource', 'CTIR_Po_Search.aspx?gubun=' + gubun, 800, 600);
}
else if (type == "2") {
// 모든 데이터를 제거하기 위해서 주석 후 수정
//$(retuenInputResourceName).val("");     // 자재명
//$(retuenInputResourceID).val("");       // 자재id
//$(retuenSpecification).val("");         // 규격
//$(retuenUnit).val("");                  // 단위
$(tr).find("input").each(function () {
$(this).val("");
});
fnAutoTotal(null, strGrid_Gubun);     // 합계 셋팅
}
        }
        function callBackFN(InputResourceID, InputResourceName, Specification, Unit) {
            $(retuenInputResourceID).val(InputResourceID);
            $(retuenInputResourceName).val(InputResourceName);
            $(retuenSpecification).val(Specification);
            $(retuenUnit).val(Unit);
        }
        function callBackFN_WorkerCost(WorkerID, WorkerName, Resident) {
            $(retuenWorkerID).val(WorkerID);
            $(retuenWorkerName).val(WorkerName);
            $(retuenResident).val(Resident);
        }


        //////////////////////////////////////////////////////////////////////////////
        // 그리드 자동계산 관련
        //////////////////////////////////////////////////////////////////////////////
        function fnAutoTotal(object, strGrid_Gubun) {
            var gridName = "";
            if (strGrid_Gubun == "gvListMaterial")
                gridName = "<%=gvListMaterial.ClientID %>";
            else if (strGrid_Gubun == "gvListEquipment")
                gridName = "<%=gvListEquipment.ClientID %>";
            else if (strGrid_Gubun == "gvListWorkerCost")
                gridName = "<%=gvListWorkerCost.ClientID %>";
            else if (strGrid_Gubun == "gvListIndirectExpense")
                gridName = "<%=gvListIndirectExpense.ClientID %>";
            else if (strGrid_Gubun == "gvListOutsideOrderExpense")
                gridName = "<%=gvListOutsideOrderExpense.ClientID %>";

var UnitPrice = 0;
var Volume = 0;
var TotalVolume = 0;
var TotalPrice = 0;


if (object != null && object != "") {
var row = object.parentNode.parentNode;

// 해당 Row의 단가, 수량 추출 후 금액 셋팅
$(row).find("input").each(function () {
var id = $(this).attr("id");

// 단가 추출
if (id == "UNITPRICE" && $(this).val() != "")
UnitPrice = $(this).val().replace(/,/g, '');

// 수량 추출
if (id == "VOLUME" && $(this).val() != "")
Volume = $(this).val().replace(/,/g, '');

// 금액 셋팅
if (id == "PRICE") {
// $(this).val(UnitPrice * Volume);
$(this).val(fnGetNumberWithComma(UnitPrice * Volume, "C"));
}
});
}


// 그리드의 모든 단가, 수량 추출
$('#' + gridName).find("input").each(function () {
var id = $(this).attr("id");

if (id == "VOLUME" && $(this).val() != "")
TotalVolume += parseInt($(this).val().replace(/,/g, ''));

if (id == "PRICE" && $(this).val() != "")
TotalPrice += parseInt($(this).val().replace(/,/g, ''));
});


// 합계 셋팅
$('#' + gridName).find("span").each(function () {
var id = $(this).attr("id");

if (id.indexOf("_lblTotalVOLUME") > 0)
$(this).text(fnGetNumberWithComma(TotalVolume, "C"));

if (id.indexOf("_lblTotalPRICE") > 0)
$(this).text(fnGetNumberWithComma(TotalPrice, "C"));
});


            // 총계 섹션의 "계획금액 합계" 자동계산 함수 호출
            fnAutoPlanTotal();
        }


        //////////////////////////////////////////////////////////////////////////////
        // 총계 섹션의 "계획금액 합계" 자동계산
        //////////////////////////////////////////////////////////////////////////////
        function fnAutoPlanTotal() {
            var planTotalPrice = 0;

            var tr_Material = $('#<%=gvListMaterial.ClientID %>').find('tr:last').clone();
            var tr_Equipment = $('#<%=gvListEquipment.ClientID %>').find('tr:last').clone();
            var tr_WorkerCost = $('#<%=gvListWorkerCost.ClientID %>').find('tr:last').clone();
            var tr_IndirectExpense = $('#<%=gvListIndirectExpense.ClientID %>').find('tr:last').clone();
            var tr_OutsideOrderExpense = $('#<%=gvListOutsideOrderExpense.ClientID %>').find('tr:last').clone();

            // 자재
            $(tr_Material).find("span").each(function () {
                var id = $(this).attr("id");

                if (id.indexOf("_lblTotalPRICE") > 0)
                    planTotalPrice += parseInt($(this).text().replace(/,/g, ''));
            });

            //장비
            $(tr_Equipment).find("span").each(function () {
                var id = $(this).attr("id");

                if (id.indexOf("_lblTotalPRICE") > 0)
                    planTotalPrice += parseInt($(this).text().replace(/,/g, ''));
            });

            //노무비
            $(tr_WorkerCost).find("span").each(function () {
                var id = $(this).attr("id");

                if (id.indexOf("_lblTotalPRICE") > 0)
                    planTotalPrice += parseInt($(this).text().replace(/,/g, ''));
            });

            //간접경비
            $(tr_IndirectExpense).find("span").each(function () {
                var id = $(this).attr("id");

                if (id.indexOf("_lblTotalPRICE") > 0)
                    planTotalPrice += parseInt($(this).text().replace(/,/g, ''));
            });

            //외주비
            $(tr_OutsideOrderExpense).find("span").each(function () {
                var id = $(this).attr("id");

                if (id.indexOf("_lblTotalPRICE") > 0)
                    planTotalPrice += parseInt($(this).text().replace(/,/g, ''));
            });

            $("#<%=FLD_PLANAMOUNTTOTAL.ClientID %>").val(fnGetNumberWithComma(planTotalPrice, "C"));
        }


        //////////////////////////////////////////////////////////////////////////////
        // 그리드 Row 추가
        //////////////////////////////////////////////////////////////////////////////
        function fnAddRow(object, strGrid_Gubun) {
            var gridName = "";
            if (strGrid_Gubun == "gvListMaterial")
                gridName = "<%=gvListMaterial.ClientID %>";
            else if (strGrid_Gubun == "gvListEquipment")
                gridName = "<%=gvListEquipment.ClientID %>";
            else if (strGrid_Gubun == "gvListWorkerCost")
                gridName = "<%=gvListWorkerCost.ClientID %>";
            else if (strGrid_Gubun == "gvListIndirectExpense")
                gridName = "<%=gvListIndirectExpense.ClientID %>";
            else if (strGrid_Gubun == "gvListOutsideOrderExpense")
                gridName = "<%=gvListOutsideOrderExpense.ClientID %>";


            // 합계 Row 정보
            var $tr_Auto = $('#' + gridName).find('tr:last').clone();

            // 합계 Row 삭제
            $('#' + gridName).find('tr:last').remove();


            // 합계 Row 삭제 시점의 마지막 Row
            var $tr = $('#' + gridName).find('tr:last').clone();

            // 합계 Row 삭제 시점의 마지막 Row 셋팅
            // 합계 전의 tr
            $tr.find("input").each(function () {
                var id = $(this).attr("id");
             
                if (id == "UNITPRICE" || id == "VOLUME" || id == "WORKDAY" || id == "PRICE")
                    $(this).val("0");
                else if ($(this).attr("id").indexOf("_ddlWORKDAY") >= 0)
                    $(this).val("0");
                else if (id == "STATUS_GUBUN")
                    $(this).val("I");
                else
                    $(this).val("");
            });

            // 합계 Row 삭제 시점의 마지막 Row 추가
            $('#' + gridName).append($tr);


            // 삭제한 합계 Row 추가
            $('#' + gridName).append($tr_Auto);
        }


        //////////////////////////////////////////////////////////////////////////////
        // 그리드 삭제, 삭제취소 버튼
        //////////////////////////////////////////////////////////////////////////////
        function fnAddDelete(object, strGrid_Gubun) {
            var tr = object.parentNode.parentNode;

            if ($(object).text() == "삭제") {
                $(tr).find("input, img, button, select").each(function () {
                    if ($(this).attr("id") == "btnDelete")
                        $(this).text("삭제취소");
                    else if ($(this).attr("id") == "STATUS_GUBUN") {
                        if ($(this).val() == "I")
                            $(tr).remove();
                        else
                            $(this).val("D");
                    }
                    else
                        $(this).prop("disabled", true);
                });
            }
            else {
                $(tr).find("input, img, button, select").each(function () {
                    if ($(this).attr("id") == "btnDelete")
                        $(this).text("삭제");
                    else if ($(this).attr("id") == "STATUS_GUBUN") {
                        $(this).val("U");
                    }
                    else
                        $(this).prop("disabled", false);
                });
            }

            fnAutoTotal(null, strGrid_Gubun)
        }


        //////////////////////////////////////////////////////////////////////////////
        // 그리드 Cell 수정 함수
        //////////////////////////////////////////////////////////////////////////////
        function fnChange(object) {
            var tr = object.parentNode.parentNode;
            var statusGubun = $(tr).find("#STATUS_GUBUN").val();

            if (statusGubun != "I")
                $(tr).find("#STATUS_GUBUN").val("U");
        }


        //////////////////////////////////////////////////////////////////////////////
        // 총계 섹션 값 변경
        //////////////////////////////////////////////////////////////////////////////
        function fnPlanChange() {
            $("#FLD_STATUS_GUBUN").val("U");
        }
    </script>




전체적인 소스는 아래의 링크를 클릭하세요.

aspx 전체소스 다운로드
cs 전체소스 다운로드

이상으로 .net GridView 추가,삭제,저장에 대해서 알아보았습니다.

댓글

이 블로그의 인기 게시물

껌 떼는 법 (완벽 제거)

학점 계산기 (백분위 환산) 완벽 정리

[엑셀] 셀에 수식 적용하는 모든 것 완벽 정리