C# 从动态radiobutonlist、dropdownlist和textbox获取数据

C# 从动态radiobutonlist、dropdownlist和textbox获取数据,c#,asp.net,.net,C#,Asp.net,.net,水鬼 我有一个从数据库中读取数据的方法,然后创建一些用户应该填充的控件(textbox,radiobuttonlist…) var集合=新列表(); OracleConnection conn=this.ApplicationContext.GetConnection(CrmContext.connectionnum.CrmDatabase); OracleCommand cmd=新的OracleCommand(); 字符串sql=一些查询; OracleDataAdapter da=新的Ora

水鬼

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

var集合=新列表();
OracleConnection conn=this.ApplicationContext.GetConnection(CrmContext.connectionnum.CrmDatabase);
OracleCommand cmd=新的OracleCommand();
字符串sql=一些查询;
OracleDataAdapter da=新的OracleDataAdapter(sql,conn);
DataTable dt=新的DataTable();
da.填充(dt);
表tbl=新表();
TableRow tr;
TableCell tc;
foreach(数据行dr在dt.行中)
{
tr=新表行();
tc=新表单元格();
tc.Text=dr[“display_name”].ToString()+“:”;
tr.Controls.Add(tc);
开关(dr[“输入类型”].ToString())
{
案例“TXT”:
tc=新表单元格();
TextBox txt=新的TextBox();
txt.ID=dr[“name”].ToString();
txt.Text=“”;
tc.Controls.Add(txt);
tr.Controls.Add(tc);
tbl.控制添加(tr);
collection.Add(txt.ID);
Add(txt.Text.ToString());
打破
案例“RBL”:
tc=新表单元格();
string[]options=dr[“options”].ToString().Split(',');
RadioButtonList rbl=新的RadioButtonList();
for(int i=0;i
这是我创建控件的部分

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

我尝试用列表重新创建控件,但它只对文本框有效

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

有没有关于如何获得该值的提示


我一直在尝试用viewstate完成它,但是radiobuttonlist给我带来了麻烦

你最好把东西放到
网格视图中
而不是动态创建一个表,它会给你更多的控制,而且通常使用起来更方便

一旦您拥有GridView(或者如果您坚持,只需修改以下内容),在回发/单击事件上,您可以执行以下操作:

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;
            }
        }
    }

请记住,如果您已经动态创建了控件,则需要在回发时重新创建它们,否则它们的事件将不会触发。

这将有点麻烦,但您基本上可以从发布的表单本身收集控件值。为此,你需要有他们的名字列表。对于服务器端控件,名称属性由控件的
ClientID
字段填写,并且只有在预渲染之后才能访问此字段。我假设您在运行PreRender之前创建控件,所以建议是这样的

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

private List<Control> controls = new List<Control>();
并在PreRender中从这些控件收集
ClientID
,并将其存储在视图状态:

protected void Page_PreRender(object source, EventArgs e)
{
    List<string> ids = controls.Select(c => c.ClientID).ToList();
    ViewState["controls"] = ids;
}
protectedvoid页面\u预呈现(对象源,事件参数e)
{
List id=controls.Select(c=>c.ClientID.ToList();
ViewState[“控件”]=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
    }
}
List id=ViewState[“控件”]作为列表;
如果(id!=null)
{
foreach(id中的字符串id)
{
字符串值=Request.Form[id];
//用这个值做你需要的任何事情
}
}
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
    }
}