无法在EditItemTemplate

时间:2018-01-05 17:54:38

标签: c# asp.net gridview

我尝试使用C#在ASP.NET中执行一个简单的待办事项列表应用程序,当我想使用DropDownList中的值更新GridView时,我遇到了问题。我在这个网站上已经阅读了很多关于这个问题的解决问题,但是到目前为止他们都没有工作,或者我一定错过了什么。根据这些答案,我尝试了2种方法:

  1. 方法:我添加了一个GridView来显示,并添加了一个FormView来添加任务。我创建了一个数据库,其中包含任务表,包括Id,Name,Priority,DueDate,Completed列和一个优先级表(Low-Medium-High) 我的代码看起来是:
  2. ASP.NET GridView部分:

     <asp:GridView ID="grdTasks" runat="server" AutoGenerateColumns="False" OnRowDataBound="grdTasks_RowDataBound" BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" ForeColor="Black" GridLines="Vertical" OnRowEditing="grdTasks_RowEditing" AutoGenerateDeleteButton="True" AutoGenerateEditButton="True" OnRowCancelingEdit="grdTasks_RowCancelingEdit" OnRowUpdating="grdTasks_RowUpdating">
    
            <Columns>
                <asp:TemplateField HeaderText="Id">
                    <EditItemTemplate>
                        <asp:TextBox ID="txtId" runat="server" Text='<%# Bind("Id") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lblId" runat="server" Text='<%# Bind("Id") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
        <asp:BoundField DataField="Name" HeaderText="Name" />
                <asp:TemplateField HeaderText="Priority">
                    <EditItemTemplate>
                        <asp:DropDownList ID="ddlPriority" runat="server" AppendDataBoundItems="True">
                        </asp:DropDownList>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lblPriority" runat="server" Text='<%# Bind("Priority") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
        <asp:BoundField DataField="DueDate" HeaderText="DueDate" />
                <asp:TemplateField HeaderText="Completed">
                    <EditItemTemplate>
                        <asp:Checkbox ID="chkCompleted" runat="server" Text='<%# Bind("Completed") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:TextBox ID="txtCompleted1" runat="server" />
                    </ItemTemplate>
                </asp:TemplateField>
        </Columns>
    

    C#部分:

    protected void Page_Load(object sender, EventArgs e)
        {
    
            if (!IsPostBack)
            {
                BindTasks();
            }
    
        }
    
        private void BindTasks()
        {
            SqlDataSource sqlDtsTasks = new SqlDataSource();
            sqlDtsTasks.ID = "sqlDtsTasks";
            this.Page.Controls.Add(sqlDtsTasks);
            sqlDtsTasks.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            sqlDtsTasks.SelectCommand = "SELECT * FROM Tasks";
            grdTasks.DataSource = sqlDtsTasks;
            grdTasks.DataBind();
        }
    
        protected void grdTasks_RowDataBound(object sender, GridViewRowEventArgs e)
        {
    
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
    
                if ((e.Row.RowState & DataControlRowState.Edit) > 0)
                {
    
                    DropDownList ddlPriority =
                              (DropDownList)e.Row.FindControl("ddlPriority");
    
                    SqlDataSource sqlDtsTasks = new SqlDataSource();
                    SsqlDtsTasks.ID = "sqlDtsTasks";
                    this.Page.Controls.Add(sqlDtsTasks);
                    sqlDtsTasks.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
                    sqlDtsTasks.SelectCommand = "SELECT [States] FROM [Reference]";
    
                    ddlPriority.DataSource = sqlDtsTasks;
    
    
                    ddlPriority.DataTextField = "States";
                    ddlPriority.DataValueField = "States";
                    ddlPriority.DataBind();
    
                    DataRowView dr = e.Row.DataItem as DataRowView;
                    ddlPriority.SelectedValue =
                                 dr["Priority"].ToString();
                }
            }
    
        }
    
    
    
        protected void grdTasks_RowEditing(object sender, GridViewEditEventArgs e)
        {
    
            grdTasks.EditIndex = e.NewEditIndex;
            BindTasks();
        }
    
    
        protected void grdTasks_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            grdTasks.EditIndex = -1;
            BindTasks();
        }
    
        protected void grdTasks_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            SqlDataSource sqlDtsTasks = new SqlDataSource();
            sqlDtsTasks.ID = "sqlDtsTasks";
            this.Page.Controls.Add(sqlDtsTasks);
            sqlDtsTasks.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    
            string Priotext = (grdTasks.Rows[e.RowIndex].Cells[2].FindControl("ddlPriority") as DropDownList).SelectedItem.Value;
            string Id = (grdTasks.Rows[e.RowIndex].Cells[0].FindControl("txtId") as TextBox).Text;
    
    
            sqlDtsTasks.UpdateCommand = "UPDATE Tasks SET [Priority] = @Priority WHERE [Id] = @Id";
    
         -->   SqlDataSource2.UpdateParameters["Id"].DefaultValue = Id;
         -->   SqlDataSource2.UpdateParameters["Priority"].DefaultValue = Priotext;
    
    
            grdTasks.DataSource = sqlDtsTasks;
            grdTasks.DataBind();
    
        }
    

    这样我从标有箭头的行中得到以下错误:

      

    System.NullReferenceException - 未将对象引用设置为对象的实例。

    这应该意味着我从ddl和文本框中得到一个空值,但我不知道为什么,当我尝试用标签显示ddl和textbox的值时,它会正确显示它。

    1. 方法:我基本上做了同样的事情,但是我没有从代码中做到这一点,而是添加了2个SqlDataSource。第一个绑定到GridView以显示任务。第二个绑定到DropDownList以显示优先级可能性(低 - 中 - 高)。此外,我使用DropDownList的智能标记中的DataBinding将SelectedValue绑定到Priority列。这样,我可以在编辑行时选择优先级,如果db中的当前值为null,我可以更新Priority列。但是,当我想再次更新时,例如从低到高我收到此错误:
        

      System.ArgumentOutOfRangeException&#39; ddlPriority&#39;具有一个无效的SelectedValue,因为它在项目列表中不存在。

    2. 正如我读到的那样,很多人指出我应该添加这样的代码并将AppendDataBoundItems设置为true:

      "<asp:ListItem Value=""></asp:ListItem>"

      我甚至尝试为每个值添加一行,如上所述,仍然是相同的错误。我错过了什么?

0 个答案:

没有答案