Asp.net 将字符串[]呈现为一系列可编辑控件?
我有一个字符串[],其中包含从一段文本中解析出来的单个单词。我需要在自己的单元格中显示每个单词,并根据单词的长度为每个单元格指定一个动态宽度。我希望能够在每行的最大宽度内有尽可能多的单词 简言之,我试图将给定的一段文本作为一系列可编辑控件呈现,呈现方式类似于它可能显示为纯文本文档的方式,每个单词在每个“行”上仅占用所需的空间 我首先尝试在表模式下使用带有RepeatLayout的DataList,并将RepeatColumns设置为10,其中的Repeater包含一个Label控件;这导致每行10个字,但每个单元格的宽度固定 我曾经考虑过使用一个带有单列的GridView,我会在每行中填充尽可能多的单词(以标签控件的形式),根据需要添加新行,直到构建整个段落Asp.net 将字符串[]呈现为一系列可编辑控件?,asp.net,dynamic,formatting,string,Asp.net,Dynamic,Formatting,String,我有一个字符串[],其中包含从一段文本中解析出来的单个单词。我需要在自己的单元格中显示每个单词,并根据单词的长度为每个单元格指定一个动态宽度。我希望能够在每行的最大宽度内有尽可能多的单词 简言之,我试图将给定的一段文本作为一系列可编辑控件呈现,呈现方式类似于它可能显示为纯文本文档的方式,每个单词在每个“行”上仅占用所需的空间 我首先尝试在表模式下使用带有RepeatLayout的DataList,并将RepeatColumns设置为10,其中的Repeater包含一个Label控件;这导致每行1
任何人都可以分享一个优雅的方法来做到这一点吗?我能想到的最好的方法就是使用一个中继器,把剩下的东西都浮起来
<asp:Repeater runat="server" id="rptr">
<ItemTemplate>
<span style="float:left; height:22px; line-height:22px;"><%# Eval("Word") %></span>
</ItemTemplate>
</asp:Repeater>
首先,我想说,从用户界面的角度来看,我不完全确定您为什么需要这样做,但如果必须这样做,您可以按照以下思路来做:
- 从字符串[]开始
- 创建一个
列表
- 在原始数组中循环,将字符串添加到新的
列表中
- 达到所需的字符总长度后,将
添加到列表
(其中包含行)列表
- 重复这些步骤,直到完成原始阵列的所有步骤
您正在寻找的魔法是“contenteditable”属性。适用于IE、Firefox和Chrome
我不知道你到底在干什么,勒芒。。。但这应该是可行的:
您的代码隐藏:
protected void Page_Load(object sender, EventArgs e)
{
//creating some bogus collection of strings.
string[] parts = { "this", "is", "a", "test", "of", "the", "goofiest", "ui", "ever" };
//bind it to the repeater.
rptr.DataSource = parts;
rptr.DataBind();
//now we'll add them to a JavaScript array we can access client side.
StringBuilder sb = new StringBuilder();
sb.Append("document.stringItems = new Array();");
for (int i = 0; i < parts.Length; i++)
sb.AppendFormat("document.stringItems[{0}] = '{1}';", i, parts[i]);
ScriptManager.RegisterClientScriptBlock(this, GetType(), "someKey", sb.ToString(), true);
}
protected void btnTest_Click(object sender, EventArgs e)
{
//display the result just so we can see it's working.
lblResult.Text = hdnResult.Value;
}
受保护的无效页面加载(对象发送方,事件参数e)
{
//创建一些伪造的字符串集合。
string[]parts={“this”、“is”、“a”、“test”、“of”、“the”、“goofiest”、“ui”、“ever”};
//将其绑定到中继器。
rptr.DataSource=零件;
rptr.DataBind();
//现在我们将它们添加到一个JavaScript数组中,我们可以访问客户端。
StringBuilder sb=新的StringBuilder();
sb.Append(“document.stringItems=newarray();”;
对于(int i=0;i
您的.ASPX:
<asp:Repeater ID="rptr" runat="server">
<ItemTemplate>
<span contenteditable="true" style="border: solid 1px;" onkeyup="updateItem(event, <%#Container.ItemIndex%>)">
<%#Container.DataItem%></span>
</ItemTemplate>
</asp:Repeater>
<asp:HiddenField ID="hdnResult" runat="server" />
<asp:Button ID="btnTest" runat="server" Text="Test" OnClick="btnTest_Click" />
<script type="text/javascript" language="javascript">
//<![CDATA[
function updateItem(e, index) {
//get the source element. (magic here for cross browser lameness)
var src;
if(window.event) {
e = window.event;
src = e.srcElement;
}else{
src = e.target;
}
//update our item in our array.
document.stringItems[index] = src.innerHTML;
//update our hidden field.
var s = '';
var space = false;
for (var i = 0; i < document.stringItems.length; i++) {
if (space)
s += ' ';
else
space = true;
s += document.stringItems[i];
}
var hdnResult = document.getElementById('<%=hdnResult.ClientID%>');
hdnResult.value = s;
}
//]]>
</script>
<asp:Label ID="lblResult" runat="server"></asp:Label>
//
您还必须为onkeypress添加一些javascript,以确保它们没有添加回车符、空格或其他您不希望它们添加的内容。。。但这是最基本的想法
我希望这有帮助。祝你好运。这与我正在从事的一个项目有关,该项目依赖于能够分解一段文字,以便对其文字进行操作并使其可以单独编辑。有点像一个基于网络的记事本,除了每个单词被视为不仅仅是一个字符串。
<asp:Repeater ID="rptr" runat="server">
<ItemTemplate>
<span contenteditable="true" style="border: solid 1px;" onkeyup="updateItem(event, <%#Container.ItemIndex%>)">
<%#Container.DataItem%></span>
</ItemTemplate>
</asp:Repeater>
<asp:HiddenField ID="hdnResult" runat="server" />
<asp:Button ID="btnTest" runat="server" Text="Test" OnClick="btnTest_Click" />
<script type="text/javascript" language="javascript">
//<![CDATA[
function updateItem(e, index) {
//get the source element. (magic here for cross browser lameness)
var src;
if(window.event) {
e = window.event;
src = e.srcElement;
}else{
src = e.target;
}
//update our item in our array.
document.stringItems[index] = src.innerHTML;
//update our hidden field.
var s = '';
var space = false;
for (var i = 0; i < document.stringItems.length; i++) {
if (space)
s += ' ';
else
space = true;
s += document.stringItems[i];
}
var hdnResult = document.getElementById('<%=hdnResult.ClientID%>');
hdnResult.value = s;
}
//]]>
</script>
<asp:Label ID="lblResult" runat="server"></asp:Label>