Как извлечь и сохранить данные из динамически созданного элемента управления в динамически создаваемой RadGrid

Хорошо, вот сценарий. Я создал полностью управляемый данными Radgrid с двумя статическими кнопками на странице, Сохранить и Отменить. Radgrid создается динамически, как и все данные в сетке (из MS SQL). Вот сложная часть, у меня есть шаблон столбца, который будет содержать элемент управления. Тип управления снова определяется данными в SQL. То есть, данные равны 6, мне нужно вернуть RadTextBox, заполненный данными из SQL, 5 = RadComboBox, также заполненный... вы получите jist. У меня всего 50 записей, поэтому у меня около 50 элементов управления, все из которых заполнены данными, которые можно изменить и сохранить. Это сложная часть. Я застрял в течение 2 дней, пытаясь выяснить, как добраться до уровня ячейки RadGrids, найти элемент управления, определить, какой это тип элемента управления, извлечь последние данные из этого элемента управления и сохранить их обратно в базу данных. Код работает, мне просто нужна помощь в поиске элементов управления и сохранении данных...

Мне нужно нажать кнопку Сохранить, которая, в свою очередь, получает все данные и сохраняет их в БД. Я не могу показать вам весь свой код, потому что код позади около 600 строк. но я продемонстрирую с одним.

Я даю идентификаторы элементов управления на основе уникального значения из этой строки, поэтому 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 ответ

Я видел нечто подобное для генерации опросов. Разница лишь в том, что он не использовал 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 и так далее.

Другие вопросы по тегам