C# 在网格模板列内填充DropDownList

C# 在网格模板列内填充DropDownList,c#,asp.net,gridview,rowdatabound,obout,C#,Asp.net,Gridview,Rowdatabound,Obout,我在一个obout网格的模板列中有一个dropdownlist。目前,我正在使用sqldatasource填充页面加载上的dropdownlist。但是,我现在必须根据某个列的值加载dropdownlist。例如:如果status=1,我将使用与status 1相关的可用选项列表填充dropdownlist <obout:Column ID="colStatus" DataField="wf_status_id" Align="center" HeaderText="Status" He

我在一个obout网格的模板列中有一个dropdownlist。目前,我正在使用sqldatasource填充页面加载上的dropdownlist。但是,我现在必须根据某个列的值加载dropdownlist。例如:如果status=1,我将使用与status 1相关的可用选项列表填充dropdownlist

<obout:Column ID="colStatus" DataField="wf_status_id" Align="center"  HeaderText="Status" HeaderAlign="center" Width="130px" Wrap="true" runat="server" AllowGroupBy="true" AllowFilter="true">
    <TemplateSettings EditTemplateId="tmpStatusIDEdit" TemplateId="tmpStatusID" />
</obout:Column>

<obout:GridTemplate runat="server" ID="tmpStatusID" >
    <Template>
        <%# Container.DataItem["Status"]%>
    </Template>
</obout:GridTemplate>
<obout:GridTemplate runat="server" ID="tmpStatusIDEdit" ControlID="ddlStatus" ControlPropertyName="value">
    <Template>
        <obout:OboutDropDownList runat="server" ID="ddlStatus" Width="100%" Height="200" MenuWidth="215" DataSourceID="sdsStatus" DataTextField="wf_status_text" DataValueField="wf_status_id" />
    </Template>
</obout:GridTemplate>

public void OnGridRowDataBound(object sender, Obout.Grid.GridRowEventArgs e)
{
     if (e.Row.RowType == Obout.Grid.GridRowType.DataRow)
     {
          DropDownList ddlStatus = new DropDownList();
          ddlStatus = (DropDownList)e.Row.FindControl("ddlStatus");
          //LOAD DROP DOWN HERE//
     }
}

public void OnGridRowDataBound(对象发送方,Obout.Grid.GridRowEventArgs e)
{
if(e.Row.RowType==Obout.Grid.GridRowType.DataRow)
{
DropDownList ddlStatus=新的DropDownList();
ddlStatus=(DropDownList)e.Row.FindControl(“ddlStatus”);
//负载下降到这里//
}
}
当我尝试执行这段代码时,每次都显示ddlStatus为null。我尝试了很多方法来获得这个,但由于某些原因,我似乎无法获得它。也许她的眼睛或其他想法可以帮助我。请让我知道我做错了什么。提前谢谢你

更新:数据绑定事件代码


受保护的无效DDL状态_数据绑定(对象发送方、事件参数e)
{
Obout.Interface.OboutDropDownList ddl=(Obout.Interface.OboutDropDownList)(发送方);
字符串statusID=Eval(“wf_status_id”).ToString();
}

我添加了数据源,因为我看不到触发数据绑定事件的其他方法。

我对
obout
控件一无所知,但我必须假设它们的行为与asp.net控件非常相似,并且刚刚被扩展。考虑到这个假设,我将尝试回答你的问题

您的
RowDataBound
事件存在一些编码问题。。。例如,我不知道为什么要定义一个
new
DropDownList
,然后尝试用下一行覆盖它。另外,听起来下一行无论如何都会返回
null

首先,我建议不要在行级别使用
DataBound
事件。使用控件的
数据绑定
事件,因为它可以更好地本地化代码,因为您可以触发特定控件的
数据绑定
,因此不必搜索它。如果您的代码发生更改(标记或代码隐藏),那么更改也会容易得多,因为它不会影响其他事情,并且引入错误的空间也会减少

因此,我将进行以下更改以解决此问题:

更改您的
下拉列表
定义以实现
数据绑定

<obout:OboutDropDownList runat="server" ID="ddlStatus" Width="100%" Height="200" 
    MenuWidth="215" OnDataBinding="ddlStatus_DataBinding" />
你也可以看到我很久以前回答的另一个问题,看看它是否有帮助,因为它正在做同样的事情,但是有一个
中继器
,但它与网格几乎是一样的:


编辑:将代码更改为使用
OboutDropDownList
数据绑定中

您可以在obout知识库中找到大量示例和示例。这些应该可以帮助您:


(它们指的是comboBox,但您可以很容易地对它们进行调整以进行ddl)

我的问题是,我需要从第1列中获取一个值,以便仅使用允许的列表项填充dropdownlist。如何在执行数据绑定时获取值?@Alex非常简单,在
数据绑定
事件期间,您只需执行
评估
即可从正在绑定的当前行数据中获取值。示例:
string yourColumnValue=Eval(“YourColumnName”).ToString()
非常感谢您的帮助Kelsey!!但是,当我尝试从其中一列中提取值时,我得到了“数据绑定方法,如Eval()、XPath()和Bind()只能在数据绑定控件的上下文中使用”。它是否需要是一个控件才能从中提取值?@Alex
Eval
仅在
数据绑定
事件中起作用,
数据绑定
事件仅适用于数据绑定控件。
<obout:OboutDropDownList runat="server" ID="ddlStatus" Width="100%" Height="200" 
    MenuWidth="215" OnDataBinding="ddlStatus_DataBinding" />
protected void ddlStatus_DataBinding(object sender, System.EventArgs e)
{
    // This will point to ddlStatus on the current row that is DataBinding so you
    // don't have to search for it.
    OboutDropDownList ddl = (OboutDropDownList)(sender);

    // Now you can fill the DropDownList and set the default value how ever you like
    ...
}