C# 从Telerik RadGrid开始读取/编辑值

C# 从Telerik RadGrid开始读取/编辑值,c#,asp.net,telerik,radgrid,C#,Asp.net,Telerik,Radgrid,我有这样的情况: 。。。包含数据的普通RadGrid。如果我对一行进行clic,我想得到: 。。。标签文本框对列表(请注意:这些数据列表是从该行获得的,但不是该行的一部分) 有了第一个雷达网,一切都好了。 因此,我使用了一个简单的HTML表作为pair列表(在第二幅图中)。此列表由数据库生成,代码隐藏 问题在于文本框的更新:如果我编辑这些文本框并在更新按钮上执行clic,则启动myRadGrid\u UpdateCommand方法。但我找不到管理这些文本框的方法(它们不出现在myRadGri

我有这样的情况:

。。。包含数据的普通RadGrid。如果我对一行进行clic,我想得到:

。。。标签文本框对列表(请注意:这些数据列表是从该行获得的,但不是该行的一部分)

有了第一个雷达网,一切都好了。 因此,我使用了一个简单的HTML表作为pair列表(在第二幅图中)。此列表由数据库生成,代码隐藏

问题在于文本框的更新:如果我编辑这些文本框并在更新按钮上执行clic,则启动myRadGrid\u UpdateCommand方法。但我找不到管理这些文本框的方法(它们不出现在myRadGrid.Controls或其他文件中)

所以我尝试在第一个RadGrid中使用另一个RadGrid,但没有运气。。。也许我得用另一个不同的遥控器

有人知道我怎么做吗

这是我实施的一部分:

    protected void myRadGrid_NeedDataSource(object source, GridNeedDataSourceEventArgs e)
{
    this.myRadGrid.DataSource = this.dtListaDettagli;
    this.dtListaDettagli.PrimaryKey = new DataColumn[] { this.dtListaDettagli.Columns["key"] };
}


protected void myRadGrid_ItemCreated(object sender, Telerik.Web.UI.GridItemEventArgs e)
{
    if (e.Item is GridEditFormItem && e.Item.IsInEditMode)
    {
        GridEditFormItem item = (GridEditFormItem)e.Item;
        UserControl userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);
        var listOfDetails = this.Session["listOfDetails"];
        //...
        var dtoTrav = (List<Detail_Type_N>) listOfDetails;
        PopolaUC(dtoTrav, userControl, e.Item.ItemIndex);
    }
}


private void PopolaUC<T>(List<T> data, UserControl uc, int index) where T : FlussiBaseDto
{
    // ...
    RadPane radPane = uc.FindControl("RadPane1") as RadPane;
    var properties = TypeDescriptor.GetProperties(typeof(Detail_Type_N));
    // ...
    var dettaglioSelected = (from x in data
                             where x.IdFlusso == idFlussoSelected && x.ProgDettaglio == progDettaglioSelected
                             select x).FirstOrDefault();

    HtmlTable htmlTable = new HtmlTable();
    htmlTable.ID = "DettaglioSinistro";
    var tRow = new HtmlTableRow();

    int i = 0;
    foreach (PropertyDescriptor prop in properties)
    {
        i++;
        if (i > 3) // organizza la sottotabella in 2 colonne
        {
            tRow = new HtmlTableRow();
            i = 1;
        }

        // Set label:
        HtmlTableCell tLabel = new HtmlTableCell();
        var stringInNormalCase = Regex.Replace(prop.Name, "(\\B[A-Z])", " $1");
        tLabel.InnerText = stringInNormalCase;
        tRow.Cells.Add(tLabel);

        // Set TextBox:
        HtmlTableCell tCell = new HtmlTableCell();
        // ...
        TextBox box = new TextBox();
        box.Text = Convert.ToString(prop.GetValue(detailSelected));
        box.ID = string.Format("my_{0}", prop.Name);
        tCell.Controls.Add(box);


        tRow.Cells.Add(tCell);
        htmlTable.Rows.Add(tRow);
    }
    radPane.Controls.Add(htmlTable);
}


protected void myRadGrid_UpdateCommand(object source, GridCommandEventArgs e)
{
    GridEditableItem editedItem = e.Item as GridEditableItem;
    UserControl userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);

    //Prepare new row to add it in the DataSource
    DataRow[] changedRows = this.dtListaDettagli.Select("key = " + editedItem.OwnerTableView.DataKeyValues[editedItem.ItemIndex]["key"]);

    // ... and then?

    catch (Exception ex)
    {
        changedRows[0].CancelEdit();

        Label lblError = new Label();
        lblError.Text = string.Format("Errore nell'aggiornamento movimento. Errore: {0} ", ex.Message);
        lblError.ForeColor = System.Drawing.Color.Red;
        RadGridIpa.Controls.Add(lblError);

        e.Canceled = true;
    }
}
protectedvoid myRadGrid\u NeedDataSource(对象源,GridNeedDataSourceEventArgs e)
{
this.myRadGrid.DataSource=this.dtListaDettagli;
this.dtListaDettagli.PrimaryKey=newdatacolumn[]{this.dtListaDettagli.Columns[“key”]};
}
受保护的无效myRadGrid_ItemCreated(对象发送方,Telerik.Web.UI.GridItemEventArgs e)
{
if(e.Item为GridEditFormItem&&e.Item.IsInEditMode)
{
GridEditFormItem项目=(GridEditFormItem)e.item;
UserControl UserControl=(UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);
var listOfDetails=this.Session[“listOfDetails”];
//...
var dtoTrav=(列表)详细信息列表;
PopolaUC(dtoTrav、userControl、e.Item.ItemIndex);
}
}
私有void PopolaUC(列表数据、用户控制uc、int索引),其中T:FlussiBaseDto
{
// ...
RadPane RadPane=uc.FindControl(“RadPane1”)作为RadPane;
var properties=TypeDescriptor.GetProperties(typeof(Detail_Type_N));
// ...
var dettaglioSelected=(从数据中的x开始)
其中x.IdFlusso==idFlussoSelected&&x.progdetaglio==progdetaglioselected
选择x).FirstOrDefault();
HtmlTable HtmlTable=新的HtmlTable();
htmlTable.ID=“dettagliosini”;
var tRow=新的HtmlTableRow();
int i=0;
foreach(属性中的PropertyDescriptor属性)
{
i++;
如果(i>3)//2科隆的organizza la sottotabella
{
tRow=新的HtmlTableRow();
i=1;
}
//设置标签:
HtmlTableCell tLabel=新的HtmlTableCell();
var stringInNormalCase=Regex.Replace(prop.Name,“(\\B[A-Z])”,“$1”);
tLabel.InnerText=stringInNormalCase;
tRow.Cells.Add(tLabel);
//设置文本框:
HtmlTableCell tCell=新的HtmlTableCell();
// ...
TextBox=新的TextBox();
box.Text=Convert.ToString(prop.GetValue(detailSelected));
box.ID=string.Format(“my_{0}”,prop.Name);
tCell.Controls.Add(框);
tRow.Cells.Add(tCell);
htmlTable.Rows.Add(tRow);
}
radPane.Controls.Add(htmlTable);
}
受保护的无效myRadGrid_UpdateCommand(对象源,GridCommandEventArgs e)
{
GridEditableItem editEM=e.项作为GridEditableItem;
UserControl UserControl=(UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);
//准备新行以将其添加到数据源中
DataRow[]changedRows=this.dtListaDettagli.Select(“key=“+EditEM.OwnerTableView.DataKeyValues[EditEM.ItemIndex][“key]”);
//…然后呢?
捕获(例外情况除外)
{
changedRows[0]。取消编辑();
Label lblError=新标签();
lblError.Text=string.Format(“Errore nell'aggiornamento movimento.Errore:{0}”,例如Message);
lblError.ForeColor=System.Drawing.Color.Red;
RadGridIpa.Controls.Add(lblError);
e、 取消=真;
}
}


您无法动态生成文本框和标签

相反,您希望使用

比如说,

<telerik:RadGrid ID="RadGrid1" ...>
   <MasterTableView>
      ...
      <EditFormSettings>
          Place those textboxes and lables here.
      </EditFormSettings>
   </MasterTableView>
</telerik:RadGrid>

...
把那些文本框和标签放在这里。

为什么我不能?我已经这样做了。。。我的问题是更新井。您可以动态添加任何服务器控件,但问题在于如何在回发时检索它们。那些动态添加的控件不在控件树中,因此当页面发回时,它们将变为null。我理解。真奇怪。。有没有办法绕过这个问题?我确实有必要动态创建标签和文本框。这是ASP.NETWeb表单的缺点。解决方法是将所有控件放置在EditFormSettings中,并根据业务逻辑在ItemCreated事件中显示和隐藏。请参阅本文,也许它会对您有所帮助