如何获得动态生成控件的ID?

时间:2013-03-13 17:20:32

标签: c# asp.net button dynamic file-upload

Hiiii,

在下图中,表&其中的控件是动态生成的。

使用dropdownlist中没有的值,单击“创建表”按钮创建表。行作为值。

如何获得特定的“Fileupload”& “上传”按钮的ID。

点击“上传”按钮时,只能访问与该按钮相同的行中的文件上载控件。它不应该遍历表中的所有fileupload控件。

enter image description here

在我的代码中,当我点击下行中的上传按钮(比如第3行)时,它也会上传在上面的文件上传控件中选择的文件(此处为第1行第2行和第3行)。

我不想要这个。我只想在单击按钮的同一行中从filupload控件上传文件。

代码:

public partial class stable : System.Web.UI.Page
{
private int tblRow;
private int tblCol = 9;
private int i, j;
private bool CTflag;

Table table = new Table();
TableRow row,rrow;
TableCell cell,rcell;
FileUpload fileUp;
Button UpLdButton;
Button btnCal;
TextBox tb;

Label tbr;

string cmdArg; // for passing filuploaders id with Command button

private string filename = "fileUpLoader";

private string tbRowId = "row";
private string tbColId = "col";

protected int Rows
{
    get
    {
        return ViewState["Rows"] != null ? (int)ViewState["Rows"] : 0;
    }
    set
    {
        ViewState["Rows"] = tblRow;
    }
}

// Columns property to hold the Columns in the ViewState
protected int Columns
{
    get
    {
        return ViewState["Columns"] != null ? (int)ViewState["Columns"] : 0;
    }
    set
    {
        ViewState["Columns"] = tblCol;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {            
        if (CTflag == false)
        {
            this.Rows = tblRow;
            this.Columns = tblCol;                
            CreateDynamicTable();                
        }
        else
        {                
            CTflag = true;                
        }
    }
    //LoadViewState(object this);
    //CreateDynamicTable();
}
protected void Button1_Click(object sender, EventArgs e)
{        
    clrControls();
    CreateDynamicTable(); 
}

protected void CreateDynamicTable()
{        
    tblRow = Convert.ToInt32(DropDownList1.SelectedValue);

    //Creat the Table and Add it to the Page    
    if (CTflag == false)
    {            
        table.Caption = "Challan Entry";
        table.ID = "Challan Entry";
        table.BackColor = System.Drawing.Color.BurlyWood;
        Page.Form.Controls.Add(table);

        // Now iterate through the table and add your controls
        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 = { "CC NO.", "DATE", "TotalAmt", "NoOfRecpt", "Energy", "New", "Theft", "Misc", "SelectFile", "Upload", "Status" };
                    Label lbl = new Label();
                    lbl.ID = "lblHeader" + j;
                    if (j == 8)
                    {
                        lbl.Width = 220;
                    }
                    else if (j == 9)
                    {
                        lbl.Width = 50;
                    }
                    else
                    {
                        lbl.Width = 100;
                    }
                    lbl.Text = Header[j];

                    // Add the control to the TableCell
                    cell.Controls.Add(lbl);
                }
                row.Cells.Add(cell);
            }

            // Add the TableRow to the Table
            table.Rows.Add(row);
        }
        for (i = 0; i < tblRow; i++)
        {
            row = new TableRow();
            row.ID = tbRowId + i;
            row.BorderStyle = BorderStyle.Ridge;

            for (j = 0; j <= tblCol; j++)
            {
                cell = new TableCell();
                cell.ID = tbColId + i + j;
                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;
                    lbl.Text = "CC NO. " + i + " ";
                    lbl.Width = 100;
                    // Add the control to the TableCell
                    cell.Controls.Add(lbl);
                }
                for (j = 1; j <= 1; j++)
                {
                    Label lbl = new Label();
                    lbl.ID = "lblRow" + i + "Col" + j;
                    lbl.Width = 100;
                    lbl.Text = Convert.ToString(DateTime.Now.Day) + "/" + Convert.ToString(DateTime.Now.Month) + "/" + Convert.ToString(DateTime.Now.Year);
                    // Add the control to the TableCell
                    cell.Controls.Add(lbl);
                }
                for (j = 2; j <= 7; j++)
                {
                    tb = new TextBox();
                    tb.Width = 100;
                    tb.ID = "txtBoxRow" + i + "Col" + j;
                    //txtbxNames[i,j] = Convert.ToString(tb.ID);
                    tb.Text = "0";
                    // Add the control to the TableCell
                    cell.Controls.Add(tb);
                }
                for (j = 8; j <= 8; j++)
                {
                    fileUp = new FileUpload();
                    //m = i; n = j;
                    fileUp.ID = filename + i + j;
                    fileUp.Width = 220;
                    cell.Controls.Add(fileUp);
                    cmdArg = fileUp.ID;

                    UpLdButton = new Button();
                    UpLdButton.Width = 100;
                    UpLdButton.Text = "Upload" + i + j;
                    UpLdButton.ID = UpLdButton.Text;
                    UpLdButton.CommandArgument= cmdArg;
                    cell.Controls.Add(UpLdButton);

                    UpLdButton.Click += new EventHandler(UpLdButton_Click);
                }
                for (j = 9; j <= 9; j++)
                {
                    Label lbl = new Label();
                    lbl.ID = "lblRow" + i + j;
                    lbl.Text = "[ Status ]";
                    lbl.Width = 100;
                    // Add the control to the TableCell
                    cell.Controls.Add(lbl);
                }
                row.Cells.Add(cell);
            }
            // Add the TableRow to the Table
            table.Rows.Add(row);
        } //outer for-loop end

        for (i = 0; i < 1; i++)
        {
            rrow = new TableRow();
            rrow.ID = "ResultRow";
            rrow.BorderStyle = BorderStyle.Ridge;                

            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 <= 0; j++)
                {
                    Label lbl = new Label();
                    //lbl.ID = "lblCCRow" + i + "Col" + j;
                    lbl.Text = "<b>Total</b>";
                    lbl.Width = 100;
                    // Add the control to the TableCell
                    rcell.Controls.Add(lbl);
                }
                for (j = 1; j <= 1; j++)
                {
                    Label lbl = new Label();
                    //lbl.ID = "lblRow" + i + "Col" + j;
                    lbl.Width = 100;
                    lbl.Text = Convert.ToString(DateTime.Now.Day) + "/" + Convert.ToString(DateTime.Now.Month) + "/" + Convert.ToString(DateTime.Now.Year);
                    // Add the control to the TableCell
                    rcell.Controls.Add(lbl);
                }
                for (j = 2; j <= 7; j++)
                {
                    tbr = new Label();
                    tbr.Width = 100;
                    tbr.ID = "txtResult" +i+j;                        
                    tbr.Text = tbr.ID;
                    tbr.EnableTheming = true;
                    tbr.BackColor = System.Drawing.Color.White;
                    //txtResNames[i, j] = Convert.ToString(tbr.ID);
                    // Add the control to the TableCell
                    rcell.Controls.Add(tbr);
                }
                for (j = 8; j <= 8; j++)
                {
                    btnCal = new Button();
                    btnCal.Width = 100;
                    btnCal.Text = "Calculate";
                    btnCal.ID = btnCal.Text;                        
                    rcell.Controls.Add(btnCal);
                    btnCal.Click += new EventHandler(btnCal_Click);
                }

                rrow.Cells.Add(rcell);
            }

            // Add the TableRow to the Table
            table.Rows.Add(rrow);
        }

        //flag seetting
        CTflag = true;
        ViewState["dynamictable"] = true;
    }
}

void btnCal_Click(object sender, EventArgs e)
{
    TextBox tbres = new TextBox();
    TextBox tbTemp = new TextBox();

    double TotAmt = 0, NoofRect = 0, Energy = 0,New1 = 0, Theft = 0, Misc = 0;
    for (int i = 0; i < tblRow; i++)
    {
        for (int j = 2; j <= 7; j++)
        {
            TextBox tb = (TextBox)FindControlRecursive(this, string.Format("txtBoxRow{0}Col{1}", i, j));
            Label tbr = (Label)FindControlRecursive(this, string.Format("txtResult{0}{1}", 0, j));
            switch (j)
            {
                case 2:
                    TotAmt += Convert.ToDouble(tb.Text);
                    Label1.Text = Convert.ToString(TotAmt);
                    tbr.Text = Convert.ToString(TotAmt);
                    break;
                case 3:
                    NoofRect += Convert.ToDouble(tb.Text);
                    //Label1.Text = Convert.ToString(NoofRect);
                    tbr.Text = Convert.ToString(NoofRect);
                    break;
                case 4:
                    Energy+= Convert.ToDouble(tb.Text);
                    //Label1.Text = Convert.ToString(TotAmt);
                    tbr.Text = Convert.ToString(Energy);
                    break;
                case 5:
                    New1+= Convert.ToDouble(tb.Text);
                    //Label1.Text = Convert.ToString(TotAmt);
                    tbr.Text = Convert.ToString(New1);
                    break;
                case 6:
                    Theft+= Convert.ToDouble(tb.Text);
                    //Label1.Text = Convert.ToString(TotAmt);
                    tbr.Text = Convert.ToString(Theft);
                    break;
                case 7:
                    Misc+= Convert.ToDouble(tb.Text);
                    //Label1.Text = Convert.ToString(TotAmt);
                    tbr.Text = Convert.ToString(Misc);
                    break;                    
            }
        }
    }        
}

protected void clrControls()
{
    Label1.Text = "";
    for (int i = 0; i < tblRow; i++)
    {
        for (int j = 2; j <= 7; j++)
        {
            fileUp = (FileUpload)FindControlRecursive(this, string.Format("fileUpLoader{0}{1}", i, 8));
            fileUp.Enabled = true;
            Button btn = (Button)FindControlRecursive(this, string.Format("Upload{0}{1}", i, 8));
            btn.Enabled=true;
            TextBox tb = (TextBox)FindControlRecursive(this, string.Format("txtBoxRow{0}Col{1}", i, j));
            tb.Text = "0";
            Label tbr = (Label)FindControlRecursive(this, string.Format("txtResult{0}{1}", 0, j));
            tbr.Text = "0";
            Label statlbl = new Label();
            statlbl = (Label)FindControlRecursive(this, string.Format("lblRow{0}{1}", i, 9));
            statlbl.Text = "[status]";
        }
    }
    for (i = 0; i < 1; i++)
    {
        for (j = 8; j <= 8; j++)
        {
            btnCal.Enabled = true;
        }
    }
}

protected override void LoadViewState(object earlierState)
{
    base.LoadViewState(earlierState);
    if (ViewState["dynamictable"] == null)
    {
        CreateDynamicTable();            
    }        
}

void UpLdButton_Click(object sender, EventArgs e)
{
    Button btnUpLD = sender as Button;

    for (int i = 0; i < tblRow; i++)
    {
        Button tb = (Button)FindControlRecursive(this, string.Format("Upload{0}{1}", i, 8));
        fileUp = (FileUpload)FindControlRecursive(this, string.Format("fileUpLoader{0}{1}", i, 8));
        Label statlbl = new Label();            
        statlbl = (Label)FindControlRecursive(this, string.Format("lblRow{0}{1}", i, 9));            
        if (!fileUp.HasFile)
        {
            //statlbl.Text = "[status]";
            continue;
        }
        else
        {                
            UploadFile(fileUp,tb);
            if (tb.Enabled == true && fileUp.Enabled == true)
            {
                statlbl.Text = "[status]";
            }
            else
            {
                statlbl.Text = "Uploaded";
            }                
        }        
    }            
}    

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
}

public static Control FindControlRecursive(Control root, string id)
{
    if (root.ID == id)
    {
        return root;
    }

    foreach (Control c in root.Controls)
    {
        Control t = FindControlRecursive(c, id);
        if (t != null)
        {
            return t;
        }
    }
    return null;
}

protected void UploadFile(FileUpload xyz, Button btn)
{        
    if (xyz.HasFile)
    {
        string extension = System.IO.Path.GetExtension(xyz.FileName);
        if (extension == ".dat" || extension == ".B60")
        {
            if (File.Exists(Server.MapPath("~\\") + xyz.FileName))
            {
                Label1.Text = "File " + xyz.FileName + " Already Exists!";
            }
            else
            {
                xyz.PostedFile.SaveAs(Server.MapPath("~\\") + xyz.FileName);
                Label1.Text = "The " + xyz.FileName + " Has been uploaded";
                btn.Enabled = false;
                xyz.Enabled = false;
            }
        }
        else
        {
            Label1.Text = "* You can select only '.dat' & '.B60' type files";
            btn.Enabled = true;
            xyz.Enabled = true;
        }            
    }
    else 
    {        
        Label1.Text = "Select a file";
    }        
}   
}

请帮助我!!! Thanx in Advance ...

1 个答案:

答案 0 :(得分:0)

为什么不在按钮的命令参数中存储行ID,然后在单击按钮时,您可以使用此循环遍历所有行,直到id匹配您要查找的行,例如

foreach (DateRow test in table.Rows)
  if ((test.findcontrol(uploadbutton) as Button).commandArgument = (Sender as Button).commandArgumrnt 
{
    //do stuff here 
}
    else
    {
    \\ do nothing
    }

希望这有帮助