如何在动态创建的RadGrid中从动态创建的控件中检索和保存数据

时间:2015-02-26 19:18:47

标签: c# telerik-grid radcombobox datagridtemplatecolumn

好的是这个场景。我创建了一个完全数据驱动的Radgrid,页面上只有2个静态按钮,保存和取消。 Radgrid是动态创建的,以及网格中的所有数据(来自MS SQL)。这是棘手的部分,我有一个包含控件的模板列。控制类型由SQL中的数据再次确定。即,数据是6,我需要返回一个RadTextBox填充来自​​SQL的数据,5 = RadComboBox,也填充...你得到了jist。我总共有50条记录,所以我有大约50个控件,所有控件都填充了可以更改和保存的数据。那是困难的部分。我已经被困2天试图找出如何进入RadGrids单元级别,找到控件,确定它是什么类型的控件,从该控件中检索最新数据并将其保存回数据库。代码有效,我只需要帮助找到控件并保存数据......

我需要点击Save按钮,然后获取所有数据并将其保存到db。我无法向您展示我的所有代码,因为代码隐藏接近600行。但我会用一个证明。

我根据该行的唯一值给出控件ID,因此ID =“c”= x其中x是唯一值。

page.aspx

<form id="formUnionActivityProtestor" runat="server">
        <asp:HiddenField ID="hiCaseId" runat="server" />
        <asp:HiddenField ID="hiCaseSequence" runat="server" />
        <telerik:RadScriptManager runat="server" ID="RadScriptManager1" ScriptMode="Release">
        </telerik:RadScriptManager>
        <div id="headDiv">
                <h2>Blah blah blah</h2>
                <h3>blah zeyblah</h3>

            <telerik:RadButton runat="server" ID="btnSaveUA" CausesValidation="true" OnClick="btnSaveUA_Click"                    
                Text="Save Union Activity" Skin="Web20" Font-Size="12px" Width="145" Font-Bold="true">
            </telerik:RadButton>

            <telerik:RadButton runat="server" ID="btnCancel" OnClientClicking="ReadOnly"
                Text="Cancel Changes" Skin="Web20" Font-Size="12px" Width="145" Font-Bold="true">
            </telerik:RadButton>

        </div>
        <hr />

        <div id="gridContainer" runat="server">
            <asp:PlaceHolder runat="server" ID="PlaceHolder1"></asp:PlaceHolder>
        </div>

</form>

page.aspx.cs

protected void Page_Init(object sender, System.EventArgs e)
{
    radgrid = new RadGrid();
    radgrid.ID = "radgrid";
    radgrid.PreRender += new EventHandler(radUAGrid_PreRender);
    PlaceHolder1.Controls.Add(radgrid);
    this.radgrid.NeedDataSource += new GridNeedDataSourceEventHandler(this.grid_NeedDataSource);
    radgrid.ItemDataBound += new Telerik.Web.UI.GridItemEventHandler(this.radgrid_ItemDataBound);            
    radgrid.MasterTableView.DataKeyNames = new string[] { "q_SortValue" };
    radgrid.MasterTableView.AutoGenerateColumns = false;
    radgrid.MasterTableView.ShowHeader = false;
    radgrid.BorderColor = System.Drawing.Color.Gray;            

    GridBoundColumn boundColumn;

    boundColumn = new GridBoundColumn();            
    boundColumn.ItemStyle.Width = 600;
    boundColumn.ItemStyle.CssClass = "prompt";
    boundColumn.DataField = "q_Prompt";
    radgrid.MasterTableView.Columns.Add(boundColumn);

    GridTemplateColumn templateColumn = new GridTemplateColumn();
    templateColumn.ItemTemplate = new TemplateColumn("q_QuestionnaireTypeID");            
    //templateColumn.ItemStyle.Width = 0;            
    templateColumn.DataField = "q_QuestionnaireTypeID";
    templateColumn.UniqueName = "q_QuestionnaireTypeID";            
    radgrid.MasterTableView.Columns.Add(templateColumn);

    boundColumn = new GridBoundColumn();            
    boundColumn.Display = false;
    boundColumn.ItemStyle.CssClass = "hidecol";            
    boundColumn.DataField = "t_QuestionnaireTypeDescription";
    radgrid.MasterTableView.Columns.Add(boundColumn);
}

public partial class TemplateColumn : System.Web.UI.Page ,ITemplate  //adding template fields
{
    string fieldName = "";
    int controlTypeID = 0;
    DataTable dt;
    int counter = 1;
    UnionActivity refMgr = new UnionActivity(Global.ICEConnectionString);       

    public TemplateColumn(string fieldName)
    {
        this.fieldName = fieldName;
    }
    public int getQuestionTypeID(int count)
    {
        int k = (from DataRow dr in dt.Rows.OfType<DataRow>()
                 where (int)dr["q_SortValue"] == count
                 select (Int32)dr["q_QuestionnaireTypeID"]).FirstOrDefault();
        return k;            
    }
    public void InstantiateIn(Control container)
    {
        if (counter == 1)
        {
            dt = UnionActivityDataTable.dt;                
        }
        controlTypeID = getQuestionTypeID(counter);            

        if (controlTypeID == 5)
        {
            int QID = (from DataRow dr in dt.Rows.OfType<DataRow>()
                        where (int)dr["q_SortValue"] == counter
                        select (int)dr["q_QuestionnaireInstanceID"]).FirstOrDefault();
            int QQID = (from DataRow dr in dt.Rows.OfType<DataRow>()
                        where (int)dr["q_SortValue"] == counter
                        select (int)dr["q_QuestionnaireInstanceQuestionID"]).FirstOrDefault();
            string answer = (from DataRow dr in dt.Rows.OfType<DataRow>()
                             where (int)dr["q_SortValue"] == counter
                             select (string)dr["a_Answer"]).FirstOrDefault(); 
            DataTable dt1;
            dt1 = getDropDownList(QID, QQID);
            RadComboBox cb = new RadComboBox();                
            foreach (DataRow row in dt1.Rows)
            {
                RadComboBoxItem item = new RadComboBoxItem();
                item.Text = row["DisplayValue"].ToString();
                item.Value = row["DDID"].ToString();
                if (answer == item.Text)
                {
                    cb.SelectedValue = item.Value;
                }
                cb.Items.Add(item);
                item.DataBind();
            }
            string x = (from DataRow dr in dt.Rows.OfType<DataRow>()
                        where (int)dr["q_SortValue"] == counter
                        select Convert.ToString((int)dr["a_QuestionnaireInstanceQuestionID"])).FirstOrDefault();              
            cb.ID = "c" + x; 
            container.Controls.Add(cb);
        }
    }
    DataTable getDropDownList(int QID, int QQID)
    {
        DataTable dt2 = new DataTable();
        try
        {
            using (refMgr)
            {   //retrieving qicr_QuestionnaireInstanceCaseReferenceID
                using (DataTable getDropDownData = refMgr.DynamicDropDownData(QID, QQID))
                {
                    if (getDropDownData != null)
                    {
                        dt2 = getDropDownData;  
                    }
                }
            }
        }
        catch (Exception ex)
        {
        }
        return dt2;
    }
}

页面加载后我查看源代码,这是组合框的插入...

<td class="rcbInputCell rcbInputCellLeft" style="width:100%;">
    <input name="radgrid$ctl00$ctl22$c12" type="text" class="rcbInput radPreventDecorate" id="radgrid_ctl00_ctl22_c12_Input" value="Kiosk" readonly="readonly" />
</td>

我需要将一个方法附加到保存按钮,但我不知道第一个开始的地方。 Telerik非常适合动态构建页面,但不能保存数据。 (甚至找到控件......)

1 个答案:

答案 0 :(得分:0)

我已经看到这样的事情用于调查生成。唯一的区别是它没有使用Grid。是否有理由需要使用网格而不是仅仅动态构建页面上的控件?

我可以建议一种方法,以便您可以轻松地从动态控件中获取值。

您可以引入一个所有调查控件都需要实现的界面。

interface ISurveyControl 
{
    // expose some common properties
    int QuestionID {get; set;}
    object Value {get; set;}
    // and others as required
}

然后为调查中所需的每种控件创建一个扩展

public class SurveyTextBox : RadTextBox, ISurveyControl
{
    public int QuestionID {get; set;}
    public object Value
    {
        get { return Text; }
        set { Text = value.ToString(); }
    }
}

public class SurveyComboBox : RadComboBox, ISurveyControl
{
    public int QuestionID {get; set;}
    public object Value
    {
        get { return SelectedValue; }
        set { SelectedValue = value.ToString(); }
    }
}

确保在构建调查时使用这些扩展控件并正确填充公共属性。

然后你需要的是一个辅助函数来从容器中查找所有ISurveyControl控件,无论它是网格还是页面。

List<ISurveyControl > FindSurveyControls(Control container) 
{
    // you can use linq to find all ISurveyControl within the container
    // you may need to make this recursive as well
}

然后,您可以在保存时迭代控件,知道它们包含足够的信息,例如QuestionID等。