Скорее всего, вы должны использовать 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.
Редактировать
Чтобы пользователь мог редактировать данные в этой сетке, у вас есть несколько вариантов. Можно было бы использовать источник данных, который поддерживает редактирование по умолчанию. Вы можете прочитать больше об этом здесь .
Вы также можете добавить редактирование вручную. Для этого вам нужно внести некоторые изменения в GridView:
- Добавить событие OnRowEditing, которое включит редактирование строки
- Добавить событие OnRowUpdating, которое обновит ваш источник данных
- Добавить событие OnRowCancelingEdit, которое отменяет режим редактирования
- Добавьте DataKey, чтобы мы могли знать, какую строку мы редактируем
- Добавление CommandField с кнопкой редактирования
- Установите для столбца первичного ключа (в данном случае в качестве имени) значение 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.