Я создал динамическую веб-страницу с использованием строго 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));
}
...