Создание пустого вида сетки для создания записей. Есть ли лучший способ добиться этого? - PullRequest
0 голосов
/ 24 апреля 2019

У меня очень большая таблица, которая была бы безумной, чтобы обновить ее, поэтому я решил создать пустую gridview, используя asp:templatefields, чтобы добавить в нее записи. Я также опускаю повторяющиеся записи, перехватывающие идентификаторы ошибок. Страница находится на ранней стадии разработки.

Это gridview Я использую:

<asp:GridView ID="addView" AllowPaging="false" CellPadding="4" GridLines="None" runat="server" AutoGenerateColumns="false"
OnRowCommand="addView_RowCommand" OnRowCreated="addView_RowCreated" OnRowDataBound="addView_RowDataBound"
OnRowDeleting="addView_RowDeleting">
<Columns>
    <asp:TemplateField HeaderText="">
        <ItemTemplate>
            <asp:LinkButton ID="Delete" runat="server" Text="Eliminar" CommandName="Delete" CssClass="enlace" />
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Lista de precios">
        <ItemTemplate>
            <asp:DropDownList ID="addList" runat="server"></asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Unidad de medida">
        <ItemTemplate>
            <asp:DropDownList ID="uomList" runat="server"></asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Tipo de Venta">
        <ItemTemplate>
            <asp:DropDownList ID="sellingcodeList" runat="server">
                <asp:ListItem Text="Sin control" Value="1"></asp:ListItem>
                <asp:ListItem Selected="True" Text="Completa" Value="2"></asp:ListItem>
                <asp:ListItem Text="Completa y fraccionada" Value="3"></asp:ListItem>
            </asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Precio">
        <ItemTemplate>
            <asp:TextBox ID="priceBox" runat="server"></asp:TextBox>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="">
        <ItemTemplate>
            <asp:LinkButton ID="adduomButton" runat="server" CommandName="Add" CssClass="enlace" Text="Añade Más" />
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

Я искал, и единственный способ найти это - сохранить DataSource в ViewState Также я нашел способ сгенерировать DataTable, используя GridView столбцы, указанные в aspx Я не знаю, есть ли лучший способ сгенерировать DataTable или, если точнее, сгенерировать встроенное количество столбцов.

Этот код и вызывается, когда Empty GridView запрашивает и инициализирует.

protected void add_Click(object sender, EventArgs e)
    {
        DataTable dt = AddViewTable();
        dt.Rows.Add(dt.NewRow());
        ViewState["addView"] = dt;

        this.addView.DataSource = dt;
        this.addView.DataBind();

        this.addPanel.Visible = true;
        this.table.Visible = false;
        this.error.Text = "";
        this.success.Text = "";
    }

Здесь я генерирую / регенерирую таблицу для каждого события, включая инициализацию

protected DataTable AddViewTable()
    {
        DataTable dt = new DataTable();
        if (ViewState["addView"] == null)
        {
            DataControlField[] cols = new DataControlField[this.addView.Columns.Count];
            this.addView.Columns.CopyTo(cols, 0);
            foreach (DataControlField col in cols)
            {
                DataColumn column = new DataColumn();
                column.ColumnName = col.HeaderText;
                dt.Columns.Add(column);
            }
        }
        else
        {
            dt = (DataTable)ViewState["addView"];
        }
        foreach (GridViewRow row in addView.Rows)
        {
            DataRow r = dt.Rows[row.RowIndex];
            if (row.FindControl("Delete") != null)
                r.SetField(0, row.Cells[0].Text);
            if (row.FindControl("addList") != null)
                r.SetField(1, ((DropDownList)row.FindControl("addList")).SelectedValue);
            if (row.FindControl("uomList") != null)
                r.SetField(2, ((DropDownList)row.FindControl("uomList")).SelectedValue);
            if (row.FindControl("sellingcodeList") != null)
                r.SetField(3, ((DropDownList)row.FindControl("sellingcodeList")).SelectedValue);
            if (row.FindControl("priceBox") != null)
                r.SetField(4, ((TextBox)row.FindControl("priceBox")).Text);
            if (row.FindControl("adduomButton") != null)
                r.SetField(5, row.Cells[5].Text);
        }
        ViewState["addView"] = dt;
        return dt;
    }

И вот события, которые я использую:

protected void addView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DropDownList AddList = (DropDownList)e.Row.Cells[1].FindControl("addList");
            if (AddList != null)
            {
                AddList.SelectedValue = ((DataTable)ViewState["addView"]).Rows[e.Row.RowIndex].ItemArray[1].ToString();
            }
            DropDownList UomList = (DropDownList)e.Row.Cells[2].FindControl("uomList");
            if (UomList != null)
            {
                UomList.SelectedValue = ((DataTable)ViewState["addView"]).Rows[e.Row.RowIndex].ItemArray[2].ToString();
            }
            DropDownList sellingcode = (DropDownList)e.Row.Cells[3].FindControl("sellingcodeList");
            if (sellingcode != null)
            {
                sellingcode.SelectedValue = ((DataTable)ViewState["addView"]).Rows[e.Row.RowIndex].ItemArray[3].ToString();
            }
            TextBox price = (TextBox)e.Row.Cells[4].FindControl("priceBox");
            if (price != null)
            {
                price.Text = ((DataTable)ViewState["addView"]).Rows[e.Row.RowIndex].ItemArray[4].ToString();
            }
        }
    }
    protected void addView_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Add")
        {
            LinkButton lb = (LinkButton)e.CommandSource;
            GridViewRow selectedRow = (GridViewRow)lb.Parent.Parent;
            DataTable dt = AddViewTable();
            dt.Rows.InsertAt(dt.NewRow(), selectedRow.RowIndex + 1);
            ViewState["addView"] = dt;
            this.addView.DataSource = dt;
            this.addView.DataBind();
        }
        else if (e.CommandName == "Delete")
        {
            LinkButton lb = (LinkButton)e.CommandSource;
            GridViewRow selectedRow = (GridViewRow)lb.Parent.Parent;
            DataTable dt = AddViewTable();
            dt.Rows.RemoveAt(selectedRow.RowIndex);
            ViewState["addView"] = dt;
            this.addView.DataSource = dt;
            this.addView.DataBind();
        }
    }

    protected void addView_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {

    }

    protected void addView_RowCreated(object sender, GridViewRowEventArgs e)
    {
        SauBus bb = new SauBus();
        DataTable dt = AddViewTable();
        DropDownList AddList = (DropDownList)e.Row.Cells[1].FindControl("addList");
        if (AddList != null)
        {
            AddList.DataSource = this.PriceList.SelectedIndex != 0 ?
                bb.GetDistinctDataTableCrm("product", "productid as id", "productnumber + ' - ' + name as name", "statecode=0 order by name") :
                bb.GetDistinctDataTableCrm("pricelevel", "pricelevelid as id", "name", "statecode=0");
            AddList.DataTextField = "name";
            AddList.DataValueField = "id";
            AddList.DataBind();
            dt.Rows[e.Row.RowIndex].ItemArray[1] = AddList.SelectedValue;
        }
        DropDownList UomList = (DropDownList)e.Row.Cells[2].FindControl("uomList");
        if (UomList != null)
        {
            UomList.DataSource = bb.GetDistinctDataTableCrm("uom", "uomid", "name", "1=1");
            UomList.DataTextField = "name";
            UomList.DataValueField = "uomid";
            UomList.DataBind();
            dt.Rows[e.Row.RowIndex].ItemArray[2] = UomList.SelectedValue;
        }
        DropDownList sellingcode = (DropDownList)e.Row.Cells[3].FindControl("sellingcodeList");
        if (sellingcode != null)
        {
            dt.Rows[e.Row.RowIndex].ItemArray[3] = sellingcode.SelectedValue;
        }
    }

Что я видел, так это то, что я звоню слишком много раз AddViewTable(), и я не знаю, смогу ли я подавить некоторые вызовы, получающие информацию о событиях, такую ​​как типы строк или состояния строк.

А потом в конце я обновляю базу

protected void addsumbit_Click(object sender, EventArgs e)
    {
        SauBus bb = new SauBus();
        this.addPanel.Visible = false;
        this.table.Visible = true;
        CrmService myCrmService = SauBus.GetMyCrmService();
        DataTable dt = AddViewTable();
        foreach (DataRow row in dt.Rows)
        {
            try
            {
                productpricelevel p = new productpricelevel();
                p.pricelevelid = new Lookup();
                p.pricelevelid.Value = this.PriceList.SelectedIndex != 0 ? Guid.Parse(productid) : Guid.Parse(row.ItemArray[1].ToString());
                p.productid = new Lookup();
                p.productid.Value = this.PriceList.SelectedIndex != 0 ? Guid.Parse(row.ItemArray[1].ToString()) : Guid.Parse(productid);
                p.uomid = new Lookup();
                p.uomid.Value = Guid.Parse(row.ItemArray[2].ToString());
                p.quantitysellingcode = new Picklist();
                p.quantitysellingcode.Value = int.Parse(row.ItemArray[3].ToString());
                p.pricingmethodcode = new Picklist();
                p.pricingmethodcode.Value = 1;//Importe en moneda
                p.amount = new CrmMoney();
                p.amount.Value = decimal.Parse(row.ItemArray[4].ToString());
                myCrmService.Create(p);
            }
            catch (System.Web.Services.Protocols.SoapException ex)
            {
                this.error.Text += "<br/>" + ex.Message + ": " + ex.Detail.InnerText + "<br/>";
            }
            catch (Exception ec)
            {
                this.error.Text = ec.ToString();
            }
        }
        FillView(); //Refilling original table
        if (this.error.Text.IndexOf('>') == -1)
            this.error.Text = "";
        this.addsumbit.Text = "Añade";
    }

Хорошо ли я справился с лечением ViewState? Или есть какой-нибудь другой / лучший способ обработки пустых GridViews для создания записей?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...