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给了我一个麻烦
答案 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
}
}