views:

195

answers:

1

This is my datatable

public static DataTable GetTableForApproval()
{
    using (var connection = Utils.Database.GetConnection())
    using (var command = new SqlCommand("SELECT [UserID], [Username], " +
           "[Email], [Role], [Date] FROM [Users] WHERE [Role] = @role",
            connection))
    {
        command.Parameters.AddWithValue("@role", "Waiting");
        using (var reader = command.ExecuteReader())
        {
            var table = new DataTable();

            table.Columns.Add("UserID", typeof(int));
            table.Columns.Add("Name", typeof(string));
            table.Columns.Add("Email", typeof(string));
            table.Columns.Add("Role", typeof(string));
            table.Columns.Add("Registration date", typeof(DateTime));

            if (reader != null)
            {
                while (reader.Read())
                {
                    table.Rows.Add((int)reader["UserID"], 
                       (string)reader["Username"], (string)reader["Email"],
                       (string)reader["Role"], (DateTime)reader["Date"]);
                }
            }
            return table;
        }
    }
}    

I want to localize the columns names. Can you tell me how can I do this? I localized my .aspx pages, but I don't know how to localize the text in .cs files.

+1  A: 

Once you have the resx files added to your project, Visual Studio generates strongly typed classes allowing you to access them. For example if you add the Messages.resx to your project a Messages static class will be created:

table.Columns.Add(Messages.UserId, typeof(int));

where UserId is a string resource you added.

A better solution would be to localize the user interface and not the column names of the DataTable. Here's an example:

<%@ Page Language="C#" AutoEventWireup="true"  %>
<script type="text/C#" runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            var table = new System.Data.DataTable();
            table.Columns.Add("UserID", typeof(int));
            for (int i = 0; i < 10; i++)
            {
                table.Rows.Add(i);
            }
            grdTest.DataSource = table;
            grdTest.DataBind();
        }
    }
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="grdTest" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="UserID" 
                    HeaderText="default value" 
                    meta:resourcekey="Grid" />
            </Columns>
        </asp:GridView>
    </div>
    </form>
</body>
</html>

There's a GridView on the page bound to a DataTable with a single column. Notice the meta:resourcekey="Grid" attribute on the BoundField. Now add the special App_LocalResources folder to your web application and inside it a resource file named Default.aspx.resx assuming the web page is called Default.aspx. Inside you could add the following string resource:

Grid.HeaderText  |  Some value

The default value of the HeaderText given in the markup will be replaced with the one in the resource file provided it is present.

Darin Dimitrov
Thank you for the quick answer.
Ivan Stoyanov