Динамическая кнопка не запускает событие нажатия или жизненный цикл страницы для кнопки (не динамическая)
У меня есть разные типы сущностей, и в зависимости от того, на какую сущность нажимают (выпадающий список), количество и типы необходимых загрузок каждый раз различаются.
Таким образом, я создаю несколько динамических элементов управления загрузкой в динамической таблице с помощью кнопки динамической загрузки, чтобы загрузить все файлы одновременно (я также попытался добавить кнопку на странице asp.net). Все хорошо, и я могу выбрать файлы для загрузки.
Проблема, с которой я столкнулся, заключается в том, что динамическое управление кнопкой не запускает событие onclicked, поэтому я не могу сохранить файлы. Я попытался создать кнопку на стороне asp.net, которая срабатывает, но из-за жизненного цикла страницы она не берет мои элементы управления загрузкой.
Затем я попытался добавить событие OnInit и создал там динамическую кнопку, а также остальные динамические элементы управления загрузкой при выбранном изменении индекса раскрывающегося списка, но затем создается все, кроме элементов динамической загрузки. Событие щелчка затем срабатывает. (Page_Init делает то же самое).
Желательно, чтобы кнопка не была динамической, а чтобы получить доступ к элементам загрузки файлов, чтобы сохранить файлы. Есть ли способ обойти жизненный цикл страницы, на котором я могу этого достичь, или кто-нибудь может сказать мне, что я делаю неправильно? Или как получить динамическую кнопку для запуска события click?
Любая помощь будет оценена....
Вот мой код того, что я сделал:
protected void lstLegalEntity_SelectedIndexChanged(object sender, EventArgs e)
{
if (CTflag == false)
{
this.Rows = tblRow;
this.Columns = tblCol;
lblAmountOfRows.Text = "4";
CreateDynamicTable();
}
else
{
CTflag = true;
}
clrControls();
}
protected void CreateDynamicTable()
{
string filterstring = "";
filterstring = "SELECT let.ID, UploadType " +
"FROM [dbo].[AssetContract_LegalEntityLinks] lel " +
"INNER Join [dbo].[AssetContract_LegalEntity] le " +
"ON lel.LegalEntityRef = le.ID " +
"INNER JOIN [dbo].[AssetContract_LegalEntityTypes] let " +
"ON lel.LegalTypeRef = let.ID " +
"WHERE lel.LegalEntityRef = @LegalEntityRef ";
cn = new SqlConnection(GetConnectionString());
SqlCommand myCmd = new SqlCommand();
myCmd.CommandText = filterstring;
myCmd.Connection = cn;
myCmd.CommandType = CommandType.Text;
if (lstLegalEntity.SelectedValue != "")
{
myCmd.Parameters.AddWithValue("@LegalEntityRef", Convert.ToInt32(lstLegalEntity.SelectedValue));
}
else
{
myCmd.Parameters.AddWithValue("@LegalEntityRef", Convert.ToInt32(0));
}
cn.Open();
SqlDataReader myReader = myCmd.ExecuteReader();
tblRow = GetUploadControlsCount();
if (CTflag == false)
{
table.Caption = "Upload Requirements";
table.ID = "Upload Requirements";
table.BackColor = System.Drawing.Color.BurlyWood;
divFileUploads.Controls.Add(table);
for (i = 0; i < 1; i++)
{
row = new TableRow();
row.BorderStyle = BorderStyle.Ridge;
for (j = 0; j <= tblCol; j++)
{
cell = new TableCell();
cell.BorderWidth = 5;
cell.BorderStyle = BorderStyle.Ridge;
cell.BorderColor = System.Drawing.Color.Azure;
for (j = 0; j <= tblCol; j++)
{
string[] Header = { "Upload Type", "File" };
Label lbl = new Label();
lbl.ID = "lblHeader" + j;
if (j == 1)
{
lbl.Width = 220;
}
else
{
lbl.Width = 100;
}
lbl.Text = Header[j];
cell.Controls.Add(lbl);
}
row.Cells.Add(cell);
}
table.Rows.Add(row);
}
int readCount = 1;
while (myReader.Read())
{
for (i = 0; i < 1; i++)
{
row = new TableRow();
row.ID = "rw" + myReader["UploadType"].ToString();
row.BorderStyle = BorderStyle.Ridge;
for (j = 0; j <= tblCol; j++)
{
cell = new TableCell();
cell.ID = tbColId + i + j + myReader["UploadType"].ToString(); ;
cell.BorderWidth = 5;
cell.BorderStyle = BorderStyle.Ridge;
cell.BorderColor = System.Drawing.Color.Azure;
for (j = 0; j <= 0; j++)
{
Label lbl = new Label();
lbl.ID = "lblCCRow" + i + "Col" + j + myReader["UploadType"].ToString();
lbl.Text = myReader["UploadType"].ToString();
lbl.Width = 100;
// Add the control to the TableCell
cell.Controls.Add(lbl);
}
for (j = 0; j < 1; j++)
{
fileUp = new FileUpload();
//m = i; n = j;
fileUp.ID = filename + i + readCount.ToString();
fileUp.Width = 350;
cell.Controls.Add(fileUp);
cmdArg = fileUp.ID;
}
row.Cells.Add(cell);
}
table.Rows.Add(row);
readCount++;
}
i = 0;
j = 0;
}
for (i = 0; i < 1; i++)
{
rrow = new TableRow();
rrow.ID = "ResultRow";
rrow.BorderStyle = BorderStyle.Ridge;
rrow.HorizontalAlign = HorizontalAlign.Center;
for (j = 0; j <= tblCol; j++)
{
rcell = new TableCell();
rcell.ID = "resultCol" + j;
rcell.BorderWidth = 5;
rcell.BorderStyle = BorderStyle.Ridge;
rcell.BorderColor = System.Drawing.Color.Azure;
for (j = 0; j < 1; j++)
{
btnUpload = new Button();
btnUpload.Width = 100;
btnUpload.Text = "Upload";
btnUpload.ID = btnUpload.Text;
rcell.Controls.Add(btnUpload);
btnUpload.Click += new EventHandler(UpLdButton_Click);
}
rrow.Cells.Add(rcell);
}
table.Rows.Add(rrow);
}
CTflag = true;
ViewState["dynamictable"] = true;
cn.Close();
myReader.Close();
}
}
protected void UpLdButton_Click(object sender, EventArgs e)
{
for (int i = 0; i < tblRow; i++)
{
fileUp = (FileUpload)FindControlRecursive(this, string.Format("fileUpLoader{0}{1}", 0, i));
//rest of code to save file
}
}
2 ответа
Почему вы не используете ретранслятор asp для отображения FileUploads?
Вы можете легко установить HTML шаблон и дизайн, так как DataSource использует DataTable ваших данных
<asp:repeater id='rp' runat='server'>
<ItemTemplate>
<%Eval("UploadType"%> -this is the caption
<asp:fileUpload id='file' runat='server'/>
<asp:Button id='btnUpload' onclick='UploadClick' runat='server'/>
</ItemTemplate>
protected void lstLegalEntity_SelectedIndexChanged(object sender, EventArgs e)
{
//get data into DataTable
rp.DataSource=dt;
rp.DataBnd();
}
protected void UpLdButton_Click(object sender, EventArgs e)
{
for (int i = 0; i < tblRow; i++)
{
//this way you get the relevant fileUpload
fileUp = (FileUpload)((Button)Sender).Parent.FindControl ("file);
//rest of code to save file
}
}
Вы были на правильном пути, когда добавили динамические кнопки в событие OnInit - вам просто нужно было также добавить элементы управления FileUpload.
Все элементы управления должны быть воссозданы на каждой обратной передаче. .NET автоматически обрабатывает элементы управления, которые вы добавили на страницу ASPX. Вы несете ответственность за динамические элементы управления, которые вы добавляете программно.
Вот несколько подходов, которые вы можете использовать, где бы вы ни находились:
Продолжайте динамически добавлять элемент управления, но внесите изменения, чтобы добавить все элементы управления, а не только кнопки.
Если у вас есть известное максимальное количество элементов управления, вы можете добавить все и контролировать то, что отображается с помощью свойства Visible. Это работает, когда количество элементов управления мало. Похоже, вы устанавливаете границы вокруг ячеек таблицы, так что в вашем случае это будет выглядеть не так хорошо. Если вы можете изменить макет так, чтобы скрытие элементов управления не приводило к остаточным артефактам, тогда это вариант.