Идентификаторы строк и столбцов в таблицах - PullRequest
0 голосов
/ 25 февраля 2012

У меня странная проблема, которую я пытаюсь выяснить. Я делаю расписание, и я должен «импортировать» наше время из календаря в него.

Я думаю, мне нужно было бы сделать строку с днями в ней строкой заголовка или заголовком таблицы. Я бы назвал каждый столбец?

Пример:

Это мое расписание

timesheet

Итак, допустим, я уезжаю 1 марта в отпуск (это четверг и будет на 2 неделе). Таким образом, это будет под колонкой 12 - «четверг».

Я бы хотел, чтобы он автоматически вставил 8 часов в ячейку для строки отпуска / столбца 12 / четверга.

Я не совсем уверен, как настроить, а затем выполнить. Настройка является более важной проблемой в данный момент. У меня есть настроенная таблица, но я думаю, что мне нужно будет внести изменения, чтобы приспособить имена столбцов и тому подобное. Я буду использовать C # для выполнения всех вычислений, заполнения и всего этого джаза. Сделайте таблицу на странице aspx. Что касается форматирования, я могу опубликовать код, если вы хотите увидеть, хотя он довольно большой.

1-й вопрос: как создать строку заголовка таблицы с идентификаторами?

2-й вопрос: то же самое, но для строк?

Связывается с третьим вопросом: если у меня есть конкретная дата, я хочу поместить ее в определенное место в таблице. Как я могу это сделать?

Любые советы или идеи помогут

1 Ответ

5 голосов
/ 25 февраля 2012

Скорее всего, вы должны использовать GridView, привязанный к какому-либо базовому источнику данных. Например:

Создайте свой GridView в aspx:

<asp:GridView ID="TimeSheetGrid" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="Name" />
        <asp:BoundField DataField="Sunday1" HeaderText="Sunday" />
        <asp:BoundField DataField="Monday1" HeaderText="Monday" />
        <asp:BoundField DataField="Tuesday1" HeaderText="Tuesday" />
        <asp:BoundField DataField="Wednesday1" HeaderText="Wednesday" />
        <asp:BoundField DataField="Thursday1" HeaderText="Thursday" />
        <asp:BoundField DataField="Friday1" HeaderText="Friday" />
        <asp:BoundField DataField="Saturday1" HeaderText="Saturday" />
        <asp:BoundField DataField="Sunday2" HeaderText="Sunday" />
        <asp:BoundField DataField="Monday2" HeaderText="Monday" />
        <asp:BoundField DataField="Tuesday2" HeaderText="Tuesday" />
        <asp:BoundField DataField="Wednesday2" HeaderText="Wednesday" />
        <asp:BoundField DataField="Thursday2" HeaderText="Thursday" />
        <asp:BoundField DataField="Friday2" HeaderText="Friday" />
        <asp:BoundField DataField="Saturday2" HeaderText="Saturday" />
    </Columns>
</asp:GridView>

Создать класс для хранения информации:

class TimeSheetItem
{
    public string Name { get; set; }

    public int Sunday1 { get; set; }
    public int Monday1 { get; set; }
    public int Tuesday1 { get; set; }
    public int Wednesday1 { get; set; }
    public int Thursday1 { get; set; }
    public int Friday1 { get; set; }
    public int Saturday1 { get; set; }

    public int Sunday2 { get; set; }
    public int Monday2 { get; set; }
    public int Tuesday2 { get; set; }
    public int Wednesday2 { get; set; }
    public int Thursday2 { get; set; }
    public int Friday2 { get; set; }
    public int Saturday2 { get; set; }
}

Разработайте метод для извлечения вашей информации (из базы данных и т. Д.). Вот что я сделал в качестве примера:

private List<TimeSheetItem> GetData()
{
    return new List<TimeSheetItem>()
    {
         new TimeSheetItem() { Name = "IN1" }
        ,new TimeSheetItem() { Name = "IN2" }
        ,new TimeSheetItem() { Name = "IN3" }
        ,new TimeSheetItem() { Name = "IN4" }
        ,new TimeSheetItem() { Name = "Personal" }
        ,new TimeSheetItem() { Name = "Doctor" }
        ,new TimeSheetItem() { Name = "Other" }
        ,new TimeSheetItem() { Name = "Sick" }
        ,new TimeSheetItem() { Name = "Vacation", Thursday2 = 8 } // Put in your 8 hours
        ,new TimeSheetItem() { Name = "Holiday" }
        ,new TimeSheetItem() { Name = "Meeting" }
    };
}

Свяжите данные с вашим GridView в коде:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        TimeSheetGrid.DataSource = GetData();
        TimeSheetGrid.DataBind();
    }
}

Это должно дать вам что-то вроде этого, которое вы можете стилизовать так, как хотите, используя CSS.

Time Sheet Example

Редактировать

Чтобы пользователь мог редактировать данные в этой сетке, у вас есть несколько вариантов. Можно было бы использовать источник данных, который поддерживает редактирование по умолчанию. Вы можете прочитать больше об этом здесь .

Вы также можете добавить редактирование вручную. Для этого вам нужно внести некоторые изменения в GridView:

  1. Добавить событие OnRowEditing, которое включит редактирование строки
  2. Добавить событие OnRowUpdating, которое обновит ваш источник данных
  3. Добавить событие OnRowCancelingEdit, которое отменяет режим редактирования
  4. Добавьте DataKey, чтобы мы могли знать, какую строку мы редактируем
  5. Добавление CommandField с кнопкой редактирования
  6. Установите для столбца первичного ключа (в данном случае в качестве имени) значение ReadOnly

Ваш GridView теперь будет выглядеть так:

<asp:GridView ID="TimeSheetGrid" 
    runat="server" 
    AutoGenerateColumns="False" 
    onrowediting="TimeSheetGrid_RowEditing" 
    onrowupdating="TimeSheetGrid_RowUpdating"
    DataKeyNames="Name" onrowcancelingedit="TimeSheetGrid_RowCancelingEdit">
    <Columns>
        <asp:CommandField ShowEditButton="true" />
        <asp:BoundField DataField="Name" HeaderText="Name" ReadOnly="true" />
        <asp:BoundField DataField="Sunday1" HeaderText="Sunday" />
        <asp:BoundField DataField="Monday1" HeaderText="Monday" />
        <asp:BoundField DataField="Tuesday1" HeaderText="Tuesday" />
        <asp:BoundField DataField="Wednesday1" HeaderText="Wednesday" />
        <asp:BoundField DataField="Thursday1" HeaderText="Thursday" />
        <asp:BoundField DataField="Friday1" HeaderText="Friday" />
        <asp:BoundField DataField="Saturday1" HeaderText="Saturday" />
        <asp:BoundField DataField="Sunday2" HeaderText="Sunday" />
        <asp:BoundField DataField="Monday2" HeaderText="Monday" />
        <asp:BoundField DataField="Tuesday2" HeaderText="Tuesday" />
        <asp:BoundField DataField="Wednesday2" HeaderText="Wednesday" />
        <asp:BoundField DataField="Thursday2" HeaderText="Thursday" />
        <asp:BoundField DataField="Friday2" HeaderText="Friday" />
        <asp:BoundField DataField="Saturday2" HeaderText="Saturday" />
    </Columns>
</asp:GridView>

В вашем коде позади ваш код должен выглядеть примерно так. Обратите внимание, что я использую объект Session для сохранения данных.

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Session["TimeSheetItems"] = GetData();
        BindData();
    }
}

protected void TimeSheetGrid_RowCancelingEdit(
     object sender
    ,GridViewCancelEditEventArgs e)
{
    // Exit edit mode - the user clicked cancel
    TimeSheetGrid.EditIndex = -1;
    BindData();
}

protected void TimeSheetGrid_RowEditing(object sender, GridViewEditEventArgs e)
{
    // Enter edit mode - the user clicked edit
    TimeSheetGrid.EditIndex = e.NewEditIndex;
    BindData();
}

protected void TimeSheetGrid_RowUpdating(
     object sender
    ,GridViewUpdateEventArgs e)
{
    var items = (IEnumerable<TimeSheetItem>)Session["TimeSheetItems"];

    // Get the TimeSheetItem that was being edited
    var item = items.Single(i => i.Name.Equals(e.Keys["Name"].ToString()));

    // Set the TimeSheetItem values to the new values
    item.Sunday1 = TryGetIntValue(e.NewValues["Sunday1"]);
    item.Monday1 = TryGetIntValue(e.NewValues["Monday1"]);
    item.Tuesday1 = TryGetIntValue(e.NewValues["Tuesday1"]);
    item.Wednesday1 = TryGetIntValue(e.NewValues["Wednesday1"]);
    item.Thursday1 = TryGetIntValue(e.NewValues["Thursday1"]);
    item.Friday1 = TryGetIntValue(e.NewValues["Friday1"]);
    item.Saturday1 = TryGetIntValue(e.NewValues["Saturday1"]);
    item.Sunday2 = TryGetIntValue(e.NewValues["Sunday2"]);
    item.Monday2 = TryGetIntValue(e.NewValues["Monday2"]);
    item.Tuesday2 = TryGetIntValue(e.NewValues["Tuesday2"]);
    item.Wednesday2 = TryGetIntValue(e.NewValues["Wednesday2"]);
    item.Thursday2 = TryGetIntValue(e.NewValues["Thursday2"]);
    item.Friday2 = TryGetIntValue(e.NewValues["Friday2"]);
    item.Saturday2 = TryGetIntValue(e.NewValues["Saturday2"]);

    // Exit from edit mode
    TimeSheetGrid.EditIndex = -1;

    // Re-bind the data
    BindData();
}

private static int TryGetIntValue(object val)
{
    int intVal;
    Int32.TryParse(val.ToString(), out intVal);
    return intVal;
}

private void BindData()
{
    TimeSheetGrid.DataSource = Session["TimeSheetItems"];
    TimeSheetGrid.DataBind();
}

private IEnumerable<TimeSheetItem> GetData()
{
    // You can pre-populate the hours here
    return new List<TimeSheetItem>()
    {
         new TimeSheetItem() { Name = "IN1" }
        ,new TimeSheetItem() { Name = "IN2" }
        ,new TimeSheetItem() { Name = "IN3" }
        ,new TimeSheetItem() { Name = "IN4" }
        ,new TimeSheetItem() { Name = "Personal" }
        ,new TimeSheetItem() { Name = "Doctor" }
        ,new TimeSheetItem() { Name = "Other" }
        ,new TimeSheetItem() { Name = "Sick" }
        ,new TimeSheetItem() { Name = "Vacation", Thursday2 = 8 }
        ,new TimeSheetItem() { Name = "Holiday" }
        ,new TimeSheetItem() { Name = "Meeting" }
    };
}

Вы можете предварительно заполнить часы в методе GetData, установив значения в TimeSheetItems или любым другим методом, который вы используете для получения ваших данных.

Это всего лишь краткий пример того, как вы можете это сделать. Вы должны прочитать больше об основах ASP.NET, C # и элементе управления GridView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...