c # эквивалентный document.getElementById ("ListBox" + i + "Item" + j) .selected = true - PullRequest
0 голосов
/ 14 февраля 2019

Я создал динамическую веб-страницу с использованием строго html, javascript и MS Access.В то время как это было функционально, локально, были сложности, развертывающие это.Так как я перенес данные в MySQL и пытаюсь использовать aspx.cs для Visual Studio, чтобы сделать большую часть того, что делал javascript ранее.

У меня есть экран, который заполняет динамический набор строк на основе результата запроса(две строки на запись для эстетики), одна из ячеек содержит раскрывающееся меню (html select / asp: ListBox).

Когда у меня все было только на javascript, я мог создать ячейку, а затем создать еесодержимого, затем установите выбранное значение, используя:

 document.getElementById("StatusDD" + rowCount).value = reader.GetValue(i);

Из того, что я до сих пор собирал, грубый эквивалент:

 ListItem li = StatusDD1.Items.FindByValue(reader.GetValue(i));
 li.Selected = true;

Однако я не могу просто жестко кодировать StatusDD1 через StatusDDx(например, в начале мой жестко заданный набор может быть больше, чем количество возвращенных записей, а две, в конечном итоге, возвращенные строки будут больше, чем набор жестко закодированных значений).

Итак, я сделал, что создалследующая функция:

 protected void setSelected(string selectId, string value)
     {
         /*Need to put something here to make the following work*/
         selectId.Items.FindByValue(value).Selected = true;
     }

Передаваемый selectId является именем / идентификатором ListBox, а значение является значением, возвращаемым из quчень.Это называется так:

 setSelected("StatusDD" + rowCount, (string)reader.GetValue(i));

Если бы я мог, из-за отсутствия лучшей фразы, материализовать имя, созданное с помощью «StatusDD» + rowCount, я мог бы передать это имя, как если бы я передавал в ListBox, скореечем строка.

В качестве альтернативы, если бы был способ выбрать ListBox из массива, где я мог бы сделать условную проверку WHERE / IF ListBox.Name = selectId, что-то вроде следующего PseudoCode :

 ListBox a = ListBox.NameMatches(selectId);
 a.Items.FindByValue(value).Selected = true;

В настоящее время списки создаются с помощью определения поля в строке и последующей передачи этой строки в HtmlTableCell:

     HtmlTable myTable = new HtmlTable();
     HtmlTableRow newRow;
     string cellId;
     string cellContents;
     int rowCount = 1;
     string statusDisabled = "";

     while (reader.Read()){
        newRow = new HtmlTableRow();
        myTable.Rows.Add( newRow );
        ...
        ...
        cellContents = "<asp:ListBox name='StatusDD" + rowCount + "' id='StatusDD" + rowCount + "' style='width:100%; " + statusDisabled + "' value='" + reader.GetValue(i) + "' onchange='markNeedSave(" + (rowCount + 1) + ")'><asp:ListItem value='0'></asp:ListItem><asp:ListItem value='1'>New</asp:ListItem>....asp:ListBox>";

        newRow.Cells.Add(new HtmlTableCell{InnerHtml = cellContents});
     }

Если это поможет, вот как у меня это получилосьработая в javascript:

     while (!rs.EOF) {
        rowa = table.insertRow(rowCount);
        rowa.id = "RECORD" + rowCount + "a";
        cell = rowa.insertCell(i + 1);
        cell.id = "RECORD" + rowCount + "_CELL" + (i + 1);

        for (i = 0; i < 8; i++) {
           cell.innerHTML = "<select name='StatusDD" + rowCount + "' id='StatusDD" + rowCount + "' style='width:100%' value='" + rs.fields(i).value + "' onchange='markNeedSave(" + (rowCount + 1) + ")'><option value='NONE'></option><option value='New'>New</option>...</select>";
           if (readonly) {
               document.getElementById("StatusDD" + rowCount).disabled = true;
           }
           document.getElementById("StatusDD" + rowCount).value = rs.fields(i).value;
        }
     ...
     }

OK, заставил ListBox работать, но когда я занимался исследованиями, и когда я наконец-то начал работать, я обнаружил, что мне нужно былоDropDownList, а не ListBox, но для того, чтобы заставить их работать, нужно было сделать те же исправления.

Сейчас я использую следующую функцию:

    protected void setSelected(string selectId, string value)
    {
       PlaceHolder TCS = Page.FindControl("TestingCS") as PlaceHolder;
       DropDownList ddl = TCS.FindControl(selectId) as DropDownList;
           if (ddl != null)
           {
                ddl.SelectedValue = value;
                ListItem item = ddl.Items.FindByValue(value);
                if(item != null)
                {    item.Selected = true;}
           }
    }

Кроме того, для моей клеткисодержимое, которое просто содержит данные с использованием следующего, прекрасно:

    cellContents = "<someString>";
    newRow.Cells.Add(new HtmlTableCell{InnerHtml = cellContents});

, но для моего раскрывающегося списка (или списка) мне нужно использовать:

    cell = new HtmlTableCell();
    newRow.Cells.Add(cell);
    DropList = new DropDownList();
    DropList.ID = "StatusDD" + rowCount;
    DropList.Items.Add(new ListItem("", "0"));
    DropList.Items.Add(new ListItem("New", "1"));
    ...

    cell.Controls.Add(DropList);
    setSelected(DropList.ID, (string)(reader.GetValue(i)));

Более гладкое решение:

    protected void setSelected(DropDownList ddl, string value)
    {
        ListItem item = ddl.Items.FindByValue(value);
        if (item != null)
        { item.Selected = true; }
    }

...

    protected void accessRecord()
    {
        ...
        DropList = new DropDownList();
        DropList.ID = "StatusDD" + rowCount;
        DropList.Attributes["onChange"] = "javascript:markNeedSave(" + rowCount + ");";
        DropList.Items.Add(new ListItem("", "0"));
        DropList.Items.Add(new ListItem("New", "1"));
        ...
        cell.Controls.Add(DropList);
        setSelected(DropList,(string)reader.GetValue(i));
    }
    ...

1 Ответ

0 голосов
/ 14 февраля 2019

Звучит так, как будто вы ищете функцию FindControl .Это можно использовать из Page или любого родительского элемента управления, который вы могли создать для хранения вашего вывода.

Пример реализации вашего метода setSelected может выглядеть следующим образом:

 protected void SetSelected(string selectId, string value)
 {
     var lb = Page.FindControl(selectId) as ListBox;
     if (lb != null)
     {
         var item = lb.Items.FindByValue(value)
         if(item != null)
             item.Selected = true;
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...