asp.net DataGrid编辑

时间:2015-06-17 12:23:16

标签: c# asp.net datagrid

我有以下asp.net DataGrid:

    <asp:DataGrid runat="server" ID="AutoGenerateTable" AutoGenerateColumns = "False" OnEditCommand="AutoGenerateTable_Edit" OnCancelCommand="btn_CancelEdits" OnUpdateCommand="btn_Update">
        <HeaderStyle Font-Bold="True" />
        <PagerStyle Mode="NumericPages" HorizontalAlign="Left" Font-Bold="true" />

        <Columns>
             <asp:BoundColumn HeaderText="Country" DataField="Country" ReadOnly="True"/>
             <asp:BoundColumn HeaderText="Partner" DataField="Partner" ReadOnly="True"/>
             <asp:BoundColumn HeaderText="Product" DataField="Product" ReadOnly="True"/>
            <asp:TemplateColumn HeaderText="Flag">
                <ItemTemplate>
                    <asp:Literal id="FlagText" runat="server" Text='<%# Eval("Flag")%>'/> 
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList runat="server" ID="FlagFropDown" >
                        <asp:ListItem Text="Auto Fulfill" Value="1" />
                        <asp:ListItem Text="Do Not Auto Fulfill" Value="0" />
                    </asp:DropDownList>
                </EditItemTemplate>
            </asp:TemplateColumn>
            <asp:EditCommandColumn HeaderText="Edit" EditText="Edit" CancelText="Cancel" UpdateText="Update" />
        </Columns>
    </asp:DataGrid> 

除了一件事以外一切正常。

当我编辑数据时,我使用DropDownList为用户提供选项。

我想在用户按下“编辑”时设置下拉列表的值。

问题是我找不到控件,因为按下编辑按钮时它不存在,所以我得到一个“对象未设置为实例”错误

按下按钮并在屏幕上显示下拉菜单后,我可以在调用更新方法时找到控件,所以我知道它最终会到达那里。

但是如何在用户按下“编辑”时设置它。

我尝试从页面中找到控件并延迟调用该方法,但这不起作用。

例如:

....
    System.Threading.Thread.Sleep(1000);
        setIndexDropdown();
    }
    public void setIndexDropdown()
    {
        DropDownList DropDown = (DropDownList)Page.FindControl("FlagFropDown");
        Response.Write(DropDown.ID);
        Response.End();
    }

任何想法??

编辑

编辑功能代码:

public void AutoGenerateTable_Edit(Object sender, DataGridCommandEventArgs e)
{
    AutoGenerateTable.EditItemIndex = e.Item.ItemIndex;
    List<string> flag = new List<string>();
        flag.Add("Auto Fulfill");
        flag.Add("Do Not Auto Fulfill");
    AutoGenerateTable.DataSource = populateTable();
    AutoGenerateTable.DataBind();
    Literal text = e.Item.Cells[3].Controls[1] as Literal;

DropDownList list = e.Item.Cells[3].Controls[1] as DropDownList;
}

2 个答案:

答案 0 :(得分:1)

您的问题是DataGridItem您试图找到您的控件。e,您DataGridCommandEventArgs的变量,是之前命令的参数>编辑。因此,DataGridItem包含编辑模式中的所有控件。这意味着您的DropDownList将不存在。

您需要做的是在绑定后获取该行DataGridItem。然后DataGridItem将包含编辑模式中 的所有控件。您已经拥有行索引,因此只需使用该索引获取新的DataGridItem

public void AutoGenerateTable_Edit(Object sender, DataGridCommandEventArgs e)
{
    // Put the data grid into edit mode
    AutoGenerateTable.EditItemIndex = e.Item.ItemIndex;
    List<string> flag = new List<string>();
        flag.Add("Auto Fulfill");
        flag.Add("Do Not Auto Fulfill");
    AutoGenerateTable.DataSource = populateTable();
    AutoGenerateTable.DataBind();
    Literal text = e.Item.Cells[3].Controls[1] as Literal;

    // Get the row again now that we are in edit mode
    DataGridItem editItem = AutoGenerateTable.Items[e.Item.ItemIndex];
    DropDownList FlagFropDown = (DropDownList)editItem.FindControl("FlagFropDown");

    // ...
}

答案 1 :(得分:0)

请使用以下代码。希望它对你有所帮助

  protected void AutoGenerateTable_EditCommand(object source, DataGridCommandEventArgs e)
        {
            // / Set the EditItemIndex property to the index of the item clicked 
            // in the DataGrid control to enable editing for that item. Be sure
            // to rebind the DateGrid to the data source to refresh the control.
            AutoGenerateTable.EditItemIndex = e.Item.ItemIndex;
            BindGrid();
        }


    protected void AutoGenerateTable_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
        Literal FlagText = null;
        if (e.Item.ItemType == ListItemType.Item)
        {
            FlagText = e.Item.FindControl("FlagText") as Literal;
        }
        if (e.Item.ItemType == ListItemType.EditItem)
        {
            DropDownList FlagFropDown = e.Item.FindControl("FlagFropDown") as DropDownList;
            if (FlagText != null)
            {
                string value = FlagText.Text.Trim();
                if (FlagFropDown != null)
                {
                    //now you have got the object of dropdown
                    //If you want to do any opertaion on dropdown can write code for it.
                    FlagFropDown.Items.FindByText(value).Selected = true;
                }
            }
        }
    }