Martin Lauritsen Ответов: 1

Проблемы подсчета динамических строк таблицы (получение выпадающих значений)


Привет, у меня есть проблема с получением динамических значений выпадающего списка, я делаю несколько строк в динамической таблице, где я делаю больше выпадающих списков, где есть каскадные выпадающие списки, поэтому при выборе в первом выпадающем списке затем заполните выпадающее число 2 теми данными, которые подходят. Моя проблема заключается в том, чтобы сделать его динамическим, чтобы он работал на всех строках таблицы, а не только на первой строке. И попробовал сосчитать строки, но не может заставить его работать.

Мне нужно добавить идентификатор в выпадающий список в методе seleceted index change, чтобы он работал со всеми выпадающими списками

С#

Создавать
private void CreateDynamicTable()
{
    PlaceHolder1.Controls.Clear();

    // Fetch the number of Rows and Columns for the table 
    // using the properties
    int tblRows = Rows;
    int tblCols = Columns;

    // Create a Table and set its properties 
    Table tbl = new Table();
    tbl.ID = "Table1";

    // Add the table to the placeholder control
    PlaceHolder1.Controls.Add(tbl);

    // Now iterate through the table and add your controls 
    XmlDocument doc = new XmlDocument();

    doc.Load(Server.MapPath("./xmlReBikeInfo/InfoBikeResponse.xml"));

    for (int i = 0; i < Rows; i++)
    {
        TableRow tr = new TableRow();
        for (int j = 0; j < tblCols; j++)
        {
            TableCell tc = new TableCell();
            TextBox txtBox = new TextBox();

            txtBox.ID = "txtBox:" + i + " " + "ColumnNo:" + " " + j;
            txtBox.EnableViewState = true;

            // Add the control to the TableCell
            tc.Controls.Add(txtBox);

            DropDownList ddl = new DropDownList();
            ddl.ID = "ddlBike_" + i;
            ddl.CssClass = "dropdown";
            ddl.AutoPostBack = true;
            ddl.EnableViewState = true;
            ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);

            XmlNodeList nodeList = doc.SelectNodes("InfoBikeResponse/BikeTypes/BikeType");

            foreach (XmlNode node in nodeList)
            {
                ddl.Items.Add(new ListItem(node["TypeName"].InnerText + ""));
                ddl.ClearSelection();
            }

            DropDownList ddlSize = new DropDownList();
            ddlSize.CssClass = "dropdown";
            ddlSize.ID = "ddlSize_" + i;
            ddlSize.Visible = false;

            DropDownList ddlHjl = new DropDownList();
            ddlHjl.CssClass = "dropdown";
            ddlHjl.ID = "Hjelm" + i;

            ddlHjl.Items.Add(new ListItem("Hjelm", "0"));
            ddlHjl.Visible = false;

            XmlNodeList nodeListHjl = doc.SelectNodes("InfoBikeResponse/BikeHelmets/HelmetType");

            foreach (XmlNode node in nodeListHjl)
            {
                ddlHjl.Items.Add(new ListItem(node["HelmetId"].InnerText + HttpUtility.HtmlDecode("  ") + "" + HttpUtility.HtmlDecode("  ") + node["HelmetName"].InnerText + ""));
                ddlHjl.ClearSelection();
            }

            DropDownList ddlTil = new DropDownList();
            ddlTil.CssClass = "dropdown";
            ddlTil.ID = "Tilbehor" + i;

            ddlTil.Items.Add(new ListItem("Tilbehør", "0"));
            ddlTil.Visible = false;

            XmlNodeList nodeListTil = doc.SelectNodes("InfoBikeResponse/BikeAccessories/Accessorie");

            foreach (XmlNode node in nodeListTil)
            {
                ddlTil.Items.Add(new ListItem(node["AccessorieId"].InnerText + HttpUtility.HtmlDecode("  ") + "" + HttpUtility.HtmlDecode("  ") + node["AccessorieName"].InnerText + ""));
                ddlTil.ClearSelection();
            }

            tc.Controls.Add(ddl);
            tc.Controls.Add(ddlHjl);
            tc.Controls.Add(ddlTil);
            tc.Controls.Add(ddlSize);

            // Add the TableCell to the TableRow
            tr.Cells.Add(tc);
        }

        // Add the TableRow to the Table
        tbl.Rows.Add(tr);
    }

    // This parameter helps determine in the LoadViewState event,
    // whether to recreate the dynamic controls or not

}

ViewState["dynamictable"] = true;

Некоторые изменения индекса
 protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
    //PlaceHolder1.Controls.Clear();

    XmlDocument doc = new XmlDocument();

    doc.Load(Server.MapPath("./xmlReBikeInfo/InfoBikeResponse.xml"));

    DropDownList ddl = (DropDownList)PlaceHolder1.FindControl("ddlBike_0");
    //Use Request objects for getting the previous data of the dynamic textbox

    string biketype = ddl.SelectedValue;

    lbl.Text = biketype.ToString();

    DropDownList ddlSize = (DropDownList)PlaceHolder1.FindControl("ddlSize_0");
    ddlSize.CssClass = "dropdown";
    ddlSize.ID = "ddlSize";
    ddlSize.Visible = false;

    XDocument xdoc = XDocument.Load(Server.MapPath("./xmlReBikeInfo/InfoBikeResponse.xml"));
    var bikeSizes = xdoc.Descendants("BikeType")
        .Where(x => x.Element("TypeName").Value == biketype)
        .SelectMany(x => x.Descendants("SizeName").Select(y => y.Value))
        .ToList();

    if (biketype == "Sport Bike")
    {
        ddlSize.Items.Add(new ListItem("Højde tester", "0"));

        foreach (string s in bikeSizes)
        {
            ddlSize.Items.Add(new ListItem(s + ""));
            ddlSize.ClearSelection();

            lbl.Text = s.ToString();
        }

        ddlSize.Visible = true;
    }

    if (biketype == "Classic")
    {
        ddlSize.Items.Add(new ListItem("Højde tester", "0"));

        foreach (string s in bikeSizes)
        {
            ddlSize.Items.Add(new ListItem(s + ""));
            ddlSize.ClearSelection();

            lbl.Text = s.ToString();
        }
        ddlSize.Visible = true;
    }
}


Что я уже пробовал:

Google, подсчитывая строки и пытаясь установить счетчик

Maciej Los

Извините, но ваша проблема не ясна. Что вы имеете в виду, говоря: "Аве пытался сосчитать ряды, но не может заставить его работать"?
Что такое "строка", когда вы имеете дело с xml-данными? Каков желаемый результат?

Martin Lauritsen

Я все исправил, так что у меня больше нет этой проблемы :)

1 Ответов

Рейтинг:
6

Maciej Los

Предполагая, что вы продолжите разработку приложения, которое было описано здесь: Как я могу использовать многодисковый формате XML по каждому элементу с выпадающих меню многодисковый [^] и вы хотели бы "конвертировать" xml-данные в объект DataTable[^], пожалуйста, проверьте этот код:

XDocument xdoc = XDocument.Load(<xml_stream_here>);
//create datatable
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Type", typeof(string));
dt.Columns.Add("Price", typeof(double));
dt.Columns.Add("PriceVat", typeof(double));
dt.Columns.Add("Sizes", typeof(string));
dt.Columns.Add("Count", typeof(int));
//fetch data from xml and convert it into DataRow
var bikes = xdoc.Descendants("BikeType")
	.GroupBy(x=>x.Element("TypeName"))
	.Select(grp=> dt.LoadDataRow(new object[]
	{
		grp.Elements("Id").Select(i=>i.Value).SingleOrDefault(),
		grp.Key.Value,
		grp.Elements("TypePrice").Select(p=>p.Value).SingleOrDefault(),
		grp.Elements("TypePriceVat").Select(pv=>pv.Value).SingleOrDefault(),
		string.Join("; ", grp.Descendants("SizeName").Select(s=>s.Value)),
		grp.Descendants("Size").Count()
	}, false));
	
//copy rows into DataTable
dt = bikes.CopyToDataTable();


dt объект хранит данные следующим образом:
Id Type        Price  PriceVat Sizes                     Count
1  Classic     150    187,5    155-167; 168-172; 173-185 3 
2  Sport Bike  185    231,25   155-167; 168-172          2 
3  MTB         220    275      155-167; 168-172          2 
4  Classic E   170    212,5    168-172                   1 


Graeme_Grant

5 б

Maciej Los

Спасибо, Грэм.

Martin Lauritsen

Спасибо :)