从动态radiobutonlist,下拉列表,文本框中获取数据

时间:2015-02-25 11:45:49

标签: c# asp.net .net

hy guys

我有一个从数据库中读取数据的方法,然后创建一些用户应该填充的控件(textbox,radiobuttonlist ..)

      var collection = new List<string>();
        OracleConnection conn = this.ApplicationContext.GetConnection(CrmContext.ConnectionEnum.CrmDatabase);
        OracleCommand cmd = new OracleCommand();
        string sql = some query;
        OracleDataAdapter da = new OracleDataAdapter(sql, conn);
        DataTable dt = new DataTable();
        da.Fill(dt);

        Table tbl = new Table();
        TableRow tr;
        TableCell tc;
        foreach (DataRow dr in dt.Rows)
        {

            tr = new TableRow();
            tc = new TableCell();
            tc.Text = dr["display_name"].ToString() + ": ";
            tr.Controls.Add(tc);

            switch (dr["input_type"].ToString())
            {
                case "TXT":
                    tc = new TableCell();
                    TextBox txt = new TextBox();
                    txt.ID =  dr["name"].ToString();
                    txt.Text = "";
                    tc.Controls.Add(txt);
                    tr.Controls.Add(tc);
                    tbl.Controls.Add(tr);
                    collection.Add(txt.ID);
                    kontrole.Add(txt.Text.ToString());
                    break;

                case "RBL":
                    tc = new TableCell();
                    string[] options = dr["options"].ToString().Split(',');
                    RadioButtonList rbl = new RadioButtonList();
                    for (int i = 0; i < options.Length; i++)
                    {
                        rbl.Items.Add(new ListItem(options[i], i.ToString()));
                    }
                    rbl.ID= dr["name"].ToString();
                    tc.Controls.Add(rbl);
                    tr.Controls.Add(tc);
                    tbl.Controls.Add(tr);
                    collection.Add(rbl.ID);
                    kontrole.Add(rbl.SelectedValue.ToString());
                    break;               
            }
        }
        PlaceHolder1.Controls.Add(tbl);
        ControlsCollection = collection;

这是我创建控件的部分

我有另一个按钮保存在表单上,​​在那个单击我应该从创建的控件读取数据并调用samo其他方法,但我不能这样做

我尝试使用List重新创建控件,但它仅适用于文本框

重新创建控件不是必须的,只需获取control.id值就足够了(textbox.text,radiobuttonlist.selectedindex)

有关如何获得这些价值的任何提示?

我一直试图用viewstate完成它,但radiobuttonlist给了我一个麻烦

2 个答案:

答案 0 :(得分:0)

您最好将内容放入GridView而不是动态创建表格,它会为您提供更多控制权,并且通常可以更好地使用。

一旦你有了GridView(或者如果你坚持,只需改编以下内容),在PostBack / Click事件上你可以这样做:

protected void MyLinkButton_Click(object sender, EventArgs e)
{
    foreach (GridViewRow gvr in MyGridView.Rows)
    {
        int radioItemValue = 0;
        string radioItemText = "";

        foreach (DataControlFieldCell dc in gvr.Cells)
        {
            string cellName = dc.ContainingField.ToString();
            string cellText = dc.Text;
            switch (cellName)
            {
                case ("MyColumnNameWithRadioButtonList"):
                    try
                    {
                        var tb = (TextBox)gvr.FindControl("MyTextBox");
                        var rbl = (RadioButtonList)gvr.FindControl("MyRadioButtonList");
                        var rb = (ListControl)rbl;
                        radioItemValue = Convert.ToInt32(rb.SelectedValue);
                        radioItemText = rb.SelectedItem.Text;
                    }
                    catch (Exception ex)
                    {
                        //error trapping required?
                    }
                    break;
                case ("AnotherColumn"):
                    //do some other stuff?
                    break;
                default:
                    break;
            }
        }
    }

请记住,如果您有动态创建的控件,则需要在PostBack上重新创建它们,否则它们的事件不会触发。

答案 1 :(得分:0)

这有点像hacky,但你基本上可以从发布的表单本身收集控制值。为此,你需要有一个他们的名字列表。对于服务器端控件,名称属性使用控件的ClientID字段填充,并且此字段只能在PreRender之后访问。我假设您在运行PreRender之前创建控件,因此建议就是这样。

在页面上有一个字段以包含所有动态创建的控件:

private List<Control> controls = new List<Control>();

在创建控件时,请务必将它们添加到此列表中:

tc.Controls.Add(txt);
tr.Controls.Add(tc);
tbl.Controls.Add(tr);

controls.Add(txt); // the same for other types of course

在PreRender中从这些控件中收集ClientID并将其存储在视图状态中:

protected void Page_PreRender(object source, EventArgs e)
{
    List<string> ids = controls.Select(c => c.ClientID).ToList();
    ViewState["controls"] = ids;
}

现在发布回发后,您需要阅读表单值:

List<string> ids = ViewState["controls"] as List<string>;
if (ids != null)
{
    foreach (string id in ids)
    {
        string value = Request.Form[id];
        //do whatever you need with the value
    }
}