2012-02-29 2 views
0

Я разрабатываю простую систему интранет-предложений, которая позволяет сотрудникам представить свои идеи через нее. Теперь, для системного администратора, я перечисляю все представленные предложения с указанием имени сотрудника, имени пользователя, раздела, заголовка предложения, описания предложения с добавлением одного столбца, который показывает статус. В столбце «Статус» он отобразит список DropDownList, который содержит возможные варианты, такие как «Принято», «Отклонено» и т. Д.Как сохранить выбранное значение в DropDownList для отображения все время?

Здесь у меня есть следующая проблема; когда администратор выбирает один из статусов, он будет изменен, но после обновления страницы DropDownList снова отобразит параметр «Выбрать». Я хочу, чтобы все время отображалось выбранное значение, а не опция Select.

Мой ASP.NET:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
         AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="ID" 
         width="950px" CssClass="mGrid" 
         AlternatingRowStyle-CssClass="alt" 
         RowStyle-HorizontalAlign="Center" 
         DataSourceID="SqlDataSource1" 
         OnRowDataBound="GridView1_RowDataBound" > 
      <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> 
      <HeaderStyle Font-Bold = "true" ForeColor="Black" Height="20px"/> 
      <Columns> 
       <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
        ReadOnly="True" SortExpression="ID" /> 
       <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" /> 
       <asp:BoundField DataField="Description" HeaderText="Description" 
        SortExpression="Description" /> 
       <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> 
       <asp:BoundField DataField="Username" HeaderText="Username" 
        SortExpression="Username" /> 
       <asp:BoundField DataField="DivisionShortcut" HeaderText="Division" 
        SortExpression="DivisionShortcut" /> 
       <asp:TemplateField HeaderText="Status"> 
        <ItemTemplate> 
         <asp:DropDownList ID="DropDownList" runat="server" DataSourceID="SqlDataSource2" 
              Font-Bold="True" ForeColor="#006666" AppendDataBoundItems="false" 
              DataTextField="Status" DataValueField="ID" AutoPostBack="true" 
              OnDataBound="DropDownList_DataBound" OnSelectedIndexChanged ="DropDownList_SelectedIndexChanged"> 
         </asp:DropDownList> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 
     <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
      ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
      SelectCommand="SELECT  dbo.SafetySuggestionsLog.ID, dbo.SafetySuggestionsLog.Title, dbo.SafetySuggestionsLog.Description, dbo.employee.Name, dbo.SafetySuggestionsLog.Username, 
         dbo.Divisions.DivisionShortcut 
FROM   dbo.employee INNER JOIN 
         dbo.SafetySuggestionsLog ON dbo.employee.Username = dbo.SafetySuggestionsLog.Username INNER JOIN 
         dbo.Divisions ON dbo.employee.DivisionCode = dbo.Divisions.SapCode" 
         FilterExpression="[DivisionShortcut] like '{0}%'"> 

         <FilterParameters> 
         <asp:ControlParameter ControlID="ddlDivision" Name="DivisionShortcut" 
               PropertyName="SelectedValue" Type="String" /> 
        </FilterParameters> 
     </asp:SqlDataSource> 

     <%--For the DropDownList--%> 
     <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
          ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
          SelectCommand="SELECT * FROM [SafetySuggestionsStatus]"> 
     </asp:SqlDataSource> 

UPDATE:

My Code-Behind:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      e.Row.Cells[0].Text = i.ToString(); 
      i++; 

      DataTable dt = new DataTable(); 
      DropDownList ddStatus = (DropDownList)e.Row.Cells[6].FindControl("DropDownList"); 
      ddStatus.DataTextField = "Status"; 
      ddStatus.DataValueField = "ID"; 
      ddStatus.DataSource = dt;//this datatable should be filled with all the possible values for the status 
      ddStatus.DataBind(); 

     } 
    } 

    DataTable GetStatusTable() 
    { 
     SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM [SafetySuggestionsStatus]", "Data Source=localhost\\sqlexpress;Initial Catalog=psspdbTest;Integrated Security=True"); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 
     return dt; 
    } 


    protected void DropDownList_DataBound(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      ((DropDownList)sender).Items.Insert(0, new ListItem("--Select--", "")); 
     } 
    } 

    protected void DropDownList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DropDownList ddl = (DropDownList)sender; 
     int suggestionStatus = int.Parse(ddl.SelectedValue); 
     GridViewRow row = (GridViewRow)ddl.NamingContainer; 
     string strID = GridView1.DataKeys[row.RowIndex]["ID"].ToString(); 
     int ID = Int32.Parse(strID); 
     //For inserting the status in the database 
     string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdbTest;Integrated Security=True"; 
     string updateCommand = "UPDATE SafetySuggestionsLog SET [StatusID] = @StatusID WHERE [ID] = @ID"; 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 
      using (SqlCommand cmd = new SqlCommand(updateCommand, conn)) 
      { 
       cmd.Parameters.Clear(); 
       cmd.Parameters.AddWithValue("@StatusID", suggestionStatus); 
       cmd.Parameters.AddWithValue("@ID", ID); 
       cmd.ExecuteNonQuery(); 
      } 
      conn.Close(); 
     } 

    } 

** Так, как решить эту проблему, чтобы статус представленного предложения будет отображаться все время?

ответ

1

попробуйте приведенный ниже код для этого поля. Изменение SelectedValue = '<% # Bind ("StatusColumnName")%>'

<asp:TemplateField HeaderText="Status"> 
        <ItemTemplate> 
         <asp:DropDownList ID="DropDownList" runat="server" 
              Font-Bold="True" ForeColor="#006666" AppendDataBoundItems="false" 
              AutoPostBack="true" 
              OnDataBound="DropDownList_DataBound" OnSelectedIndexChanged ="DropDownList_SelectedIndexChanged" SelectedValue='<%# Bind("StatusColumnName") %>'> 
         </asp:DropDownList> 
        </ItemTemplate> 
       </asp:TemplateField> 

Теперь добавьте следующий код

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) //skip header row 
    { 
DataTable dt= GetStatusTable(); 
     DropDownList ddStatus= (DropDownList)e.Row.Cells[5].FindControl("DropDownList"); 
     ddStatus.DataTextField="Status"; 
     ddStatus.DataValueField="ID" ; 
ddStatus.DataSource=dt;//this datatable should be filled with all the possible values for the status 
ddStatus.DataBind(); 
    } 
} 

DataTable GetStatusTable() 
{ 
SqlDataAdapter da= new SqlDataAdapter("select Status,ID from Status","connectionstring here"); 
DataTable dt= new DataTable(); 
da.Fill(dt); 
return dt; 
} 
+0

У меня возникла следующая ошибка: DataBinding: «System.Data.DataRowView» не содержит свойства с именем «Статус». Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде. Сведения об исключении: System.Web.HttpException: DataBinding: «System.Data.DataRowView» не содержит свойства с именем «Статус». –

+0

Не могли бы вы предоставить мне фрагмент кода? –

+0

Я использовал ваш код как есть, и я получил следующую ошибку: имя 'dt' не существует в текущем контексте. –

0
<asp:TemplateField HeaderText="Status"> 
       <ItemTemplate> 
        <asp:DropDownList ID="DropDownList" runat="server" 
             Font-Bold="True" ForeColor="#006666" AppendDataBoundItems="false" 
             AutoPostBack="true" 
            OnSelectedIndexChanged ="DropDownList_SelectedIndexChanged" DataSource="<%#WriteFunctionNameHereWhichtoBindDropDownList%>"      </asp:DropDownList> 

Теперь DropDownList будет привязана при привязке сетки. Теперь о событии GridViewItemDataBound

Найти элемент управления DropDownList и установить значение SelectedValue как поступающее из базы данных. Никогда не забывайте связывать значение в скрытом поле gridview, которое поступает из базы данных. Найдите скрытое поле и выпадающий список.

Теперь я думаю, вы можете это сделать.