ASP .NET中DataBind()函数的反转是什么

时间:2009-09-11 07:08:38

标签: c# asp.net data-binding

我目前正在使用来自ArrayList的数据源的网格视图进行数据绑定。有没有办法反转绑定并使用一行代码从网格视图中获取值?

// Bind to GUI
ArrayList dsList;
gvName.DataSource = dsList;
gvName.DataBind();

// Current Way of getting code from GUI
int iRow = 0;
foreach (GridViewRow gvr in gvName.Rows)
{
    TextBox txtD1 = gvName.FindControl("textboxName") as TextBox;
    if (txtD1 != null) 
    {
        dsList[iRow].D1 = txtD1.Text;
    }
    ....
    iRow++;
}

有没有什么方法可以让它像一个班轮一样缩短? API有这个吗?

gvName.ReverseDataBind();

2 个答案:

答案 0 :(得分:3)

API中没有类似的方法。

如果您对在页面构造期间获取绑定源感兴趣,最好的方法是使源成为页面本身的类级属性,以便它可以在任何页面的方法中使用。例如:

public class MyPage: Page {
    ArrayList dsList = new ArrayList();

    ArrayList DsList {
        get {
            return this.dsList;
        }
}

如果您有兴趣在回发上获取绑定源(响应客户端生成的事件),则可以使用某些资格。假设您不想重建绑定源(例如,通过重新查询数据库,应该始终考虑),当您第一次获取时,您必须将其保存在某处你以后可以访问它。 (数据绑定Web控件本身不会这样做。)某处可能是数据库,但有时为方便起见,人们将其保存到ViewState或将其存储在Session中。这两种方法都有其危害,但应谨慎使用 - ViewState会增加发送到客户端的Html的大小,Session会消耗服务器内存,直到明确清除或会话超时为止。< / p>

答案 1 :(得分:-1)

嗯,真正的答案是使用BindingList<T>代替数组,因为这会处理列表和绑定之间的所有双向通信,所以你不会必须从网格中手动更新列表。

但是,如果您不能使用BindingList<T>,那么您可以做的最好的事情是从行中检索数据绑定项:

// Bind to GUI
ArrayList dsList;
dgvName.DataSource = dsList;
dgvName.DataBind();

// Slightly simpler way of getting code from GUI
int iRow = 0;
foreach (DataGridViewRow dgvr in gvName.Rows)
{    
    object item = dgvr.DataBoundItem;        
    dsList[iRow].D1 = item.ToString();

    iRow++;
}

返回的DataBoundItem值可以转换为适当的类型进行处理,这比搜索文本框控件稍微简单一些。