gridview列值被操纵

时间:2012-09-17 08:26:38

标签: c# asp.net datetime gridview

我的意图是切换一个int表示的月份值 (因为它在数据库表中)

将其转换为(在GridView中显示)为字符串(月份名称) 并将其作为int返回数据库(隐藏回原始类型,以int表示的月份)。

这些是我的GridView中的相关元素,

                                                                              

<asp:GridView ID="GV_DaysPerMonth" runat="server" DataSourceID="dsWorkDayPerMonth" 
        AutoGenerateColumns="False" DataKeyNames="recordID" AllowPaging="True" 
        CellPadding="4" ForeColor="#333333" GridLines="None" Font-Names="arial" PageSize="12" 
        OnRowDataBound="GV_DaysPerMonth_RowDataBound"
        OnRowEditing="GV_DaysPerMonth_RowEditing"
        OnRowUpdating="GV_DaysPerMonth_RowUpdating">
    <AlternatingRowStyle BackColor="White" />
    <Columns>



                <asp:TemplateField HeaderText="חודש" ControlStyle-Width="100" HeaderStyle-Width="120" ItemStyle-HorizontalAlign="Center"> 
                    <ItemTemplate> 
                        <%# Eval("theMonth")%> 
                    </ItemTemplate> 
                    <EditItemTemplate> 
                        <asp:TextBox ID="TBX_theMonth" runat="server" Text='<%# Bind("theMonth")%>' /> 
                    </EditItemTemplate> 

                     

                                                                              

<asp:GridView ID="GV_DaysPerMonth" runat="server" DataSourceID="dsWorkDayPerMonth" 
        AutoGenerateColumns="False" DataKeyNames="recordID" AllowPaging="True" 
        CellPadding="4" ForeColor="#333333" GridLines="None" Font-Names="arial" PageSize="12" 
        OnRowDataBound="GV_DaysPerMonth_RowDataBound"
        OnRowEditing="GV_DaysPerMonth_RowEditing"
        OnRowUpdating="GV_DaysPerMonth_RowUpdating">
    <AlternatingRowStyle BackColor="White" />
    <Columns>



                <asp:TemplateField HeaderText="Current Month" ControlStyle-Width="100" HeaderStyle-Width="120" ItemStyle-HorizontalAlign="Center"> 
                    <ItemTemplate> 
                        <%# Eval("theMonth")%> 
                    </ItemTemplate> 
                    <EditItemTemplate> 
                        <asp:TextBox ID="TBX_theMonth" runat="server" Text='<%# Bind("theMonth")%>' /> 
                    </EditItemTemplate> 

 

我正在使用这些Helper方法来自代码Behind

    public static CultureInfo ILci = CultureInfo.CreateSpecificCulture("he-IL");

    public static string GetMonthName(int mInt)
    {
        DateTime fullDate = new DateTime(2012, mInt, 2);
        string[] tempDayArray = fullDate.ToString("MMMM", ILci).Split(' ');
        return tempDayArray[0];
    }
    public static int GetMonthAsInt(string mStr)
    {
        return DateTime.ParseExact(mStr, "MMMM", ILci).Month;

要实现这个简单的任务,但几乎没有错误,我想举例说明如何以正确的方式实现它。 我认为通过

显示int很简​​单
<%# manipulation Function( Eval("columnName")) %>

会“正常工作”

但对我来说这太复杂了 用Bind(“columnName”)

进行尝试时

我错误地认为,当它实际上在Cells [0]

中时,该值在Cells [1]内

所以我确实在正常模式下使用它 并且在编辑模式下虽然不可编辑,但在视图模式下通过Label而不是TextBox

protected void GV_DaysPerMonth_RowDataBound(object sender, GridViewRowEventArgs e)
{

    RowNum = GV_DaysPerMonth.Rows.Count;
    GridViewRow CurRow = e.Row;        // Retrieve the current row. 

    if (CurRow.RowType == DataControlRowType.DataRow)
    {
        bool isntEmptyMonth = string.IsNullOrEmpty(e.Row.Cells[0].Text) == false;
        if (isntEmptyMonth)
        {
            e.Row.Cells[1].Text = RobCS.RDates.GetMonthName(Convert.ToInt32((e.Row.Cells[0].Text)));
        }

    }
}


so i think it might be the **missing handler for the edit mode** ?

2 个答案:

答案 0 :(得分:2)

这是从int获取字符串Month name的方法:

CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(1);

更多信息:

Best way to turn an integer into a month name in c#?

要在sql server中将月份号转换为月份名,请查看:

Convert Month Number to Month Name Function in SQL

----编辑

好的,在RowDataBound上,你可能希望将int转换为string,所以它会是这样的:

void CustomersGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{

   if(e.Row.RowType == DataControlRowType.DataRow)
   {
      // Display the month name. When you GridView is bound for the first time, you 
      // will bind the month number, which you can get in e.Row.Cells[1].Text. If 
     // Cells[1] does not work, try Cells[2], till you get the correct value. The 
     // convert the int to month name and assign it to the same Cell.
     e.Row.Cells[1].Text = GetMonthNameFromInt(e.Row.Cells[1].Text)

   }

}

在Row_updating上,您希望再次将月份名称转换为int,然后更新数据集(或保存到数据库)

protected void GridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
{    

   //Update the values.
   GridViewRow row = GridView.Rows[e.RowIndex];
   var monthName = ((TextBox)(row.Cells[1].Controls[0])).Text;
   var monthNumber = GetMonthNumber(monthName);

  // code to update your dataset or database with month number 

  //Reset the edit index.
  GridView.EditIndex = -1;

  //Bind data to the GridView control.
  BindData();
}

答案 1 :(得分:1)

Page class:

private static CultureInfo culture = CultureInfo.CreateSpecificCulture("he-IL");

public static string GetMonthName(string monthNum)
{
    return culture.DateTimeFormat.GetMonthName(Convert.ToInt32(monthNum));
}

GridView的:

    <ItemTemplate> 
        <%# GetMonthName(Eval("theMonth").ToString())%> 
    </ItemTemplate> 
    <EditItemTemplate>
        <asp:DropDownList ID="ddlMonth" runat="server" SelectedValue='<%# Bind("theMonth")%>'>
            <asp:ListItem Value="1" Text="תשרי"></ListItem>
               etc...
        </asp:DropDownList>
   </EditItemTemplate>

在你的EditTemplate中有一个带有ListItems的DropDownList:value =“1”Text =“תשרי”等等。所以它是传递给你的数据层进行编辑的月份数。