在网格模板列中填充DropDownList

时间:2014-09-04 18:04:16

标签: c# asp.net gridview rowdatabound obout

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

<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//
     }
}

当我尝试执行此代码时,它表明ddlStatus每次都为null。我尝试了很多方法来获得这个,但由于某些原因似乎无法得到它。也许另一双眼睛或其他想法可以帮助我。请让我知道我做错了什么。提前谢谢你

更新:数据库事件代码

<obout:OboutDropDownList runat="server" ID="ddlStatus" Width="100%" Height="200" MenuWidth="215" OnDataBinding="ddlStatus_DataBinding" DataSourceID="sdsStatus" DataTextField="wf_status_text" DataValueField="wf_status_id" />

protected void ddlStatus_DataBinding(object sender, EventArgs e)
{
   Obout.Interface.OboutDropDownList ddl = (Obout.Interface.OboutDropDownList)(sender);
   string statusID = Eval("wf_status_id").ToString();
}

我添加了DataSource,因为我没有看到另一种方法来触发数据绑定事件。

2 个答案:

答案 0 :(得分:1)

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

您的RowDataBound事件存在一些编码问题...例如,我不确定您为什么要定义new DropDownList,然后尝试使用下一行覆盖它。此外,听起来下一行仍然会返回null

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

所以我会做出以下修改来解决这个问题:

DropDownList定义更改为实施DataBinding

<obout:OboutDropDownList runat="server" ID="ddlStatus" Width="100%" Height="200" 
    MenuWidth="215" OnDataBinding="ddlStatus_DataBinding" />

然后实施OnDataBinding事件(如果您没有将其用于其他任何事件,请删除DataBound事件):

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
    ...
}

你还可以看到我很久以前回答过的另一个问题,看它是否有帮助,因为它做同样的事情,但是使用Repeater,但它与网格几乎相同:

Populating DropDownList inside Repeater not working

编辑:在OboutDropDownList中更改了代码以使用DataBinding

答案 1 :(得分:0)

您可以在基本的知识库和示例中找到大量示例。这些应该可以帮助您:http://www.obout.com/combobox/aspnet_integration_grid.aspxhttp://www.obout.com/grid/aspnet_ajax_cascading_comboboxes.aspx

(他们指的是comboBox,但你可以很容易地调整它们做一个ddl)